[模板]RMQ(冲刺准备中)

洛谷P3865

注意:位运算一定要加括号!因为他的优先级没有加减法高;

   注意在预处理的时候判断的是前一个区间是否完整,故 i+(1<<(j-1))-1<=n;

   取logn时最好多加一位,以保漏掉数字

    与LCA要分清!

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define man 100010
 4 inline int read()
 5 {
 6     int s=0,f=1;char c=getchar();
 7     while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
 8     while(c>='0'&&c<='9'){s=s*10+c-'0';c=getchar();}
 9     return s*f;
10 }
11 int f[man][30],logn;
12 int n,m;
13 inline int rmq(int x,int y)
14 {    int k=(int)(log(y-x+1.0)/log(2.0));
15     return max(f[x][k],f[y-(1<<k)+1][k]);
16     }
17 int main()
18 {    n=read();m=read();
19     for(int i=1;i<=n;i++)
20         f[i][0]=read();
21     logn=(int)(log(n)/log(2.0))+1;
22     for(int j=1;j<=logn;j++)
23         for(int i=1;i<=n;i++)
24                if(i+(1<<(j-1))-1<=n)
25                  f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
26     for(int i=1;i<=m;i++)
27     {    int x,y;
28         x=read();y=read();
29         printf("%d
",rmq(x,y));
30         }
31     return 0;
32     }
原文地址:https://www.cnblogs.com/Slager-Z/p/7769284.html