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;}