RMQ
来源:互联网 发布:喀秋莎6.0软件入门教程 编辑:程序博客网 时间:2024/05/18 02:43
作为一种使用率极高的算法,一定不要写错
在倍增的时候,不要无脑循环,要判断数据范围
//这里写代码片#include<cstdio>#include<cstring>#include<iostream>#include<cmath>using namespace std;const int N=100003;int maxn[N][20],n,m;int main(){ scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) scanf("%d",&maxn[i][0]); int lg=log(n)/log(2)+1; for (int i=1;i<=lg;i++) for (int j=1;j+(1<<i)<=n+1;j++) //加一个判断 j+(1<<i)<=n+1 防止爆数组 maxn[j][i]=max(maxn[j][i-1],maxn[j+(1<<(i-1))][i-1]); for (int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); int ln=log(y-x)/log(2); //本来就是下取整 int x1=maxn[x][ln]; int y1=maxn[y-(1<<ln)+1][ln]; printf("%d\n",max(x1,y1)); } return 0;}