[模板]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\n",rmq(x,y));
30         }
31     return 0;
32     }

 

posted @ 2017-11-02 00:38  Slager_Z  阅读(176)  评论(0编辑  收藏  举报
博客园 首页 私信博主 显示目录 隐藏目录 管理 动画