RMQ模板

来源:互联网 发布:工作照软件 编辑:程序博客网 时间:2024/05/21 00:55

感觉还是线段树比较清楚一点,

当然RMQ也挺方便的。对于查询次数特别多的处理比较优秀。

#include <iostream>#include <stdio.h>#include <math.h>using namespace std;#define LL long longconst int  N  = 1e6;int a[N];//数组1开始int n;int mx[N][30];void RMQpre(){    int temp=(int)log2((double)n);    for(int i=1;i<=n;i++)    {        mx[i][0]=a[i];    }    for(int j=1;j<=temp;j++)    {        for(int i=1;i+(1<<j)-1<=n;i++)        {            mx[i][j]=max(mx[i][j-1],mx[i+(1<<j-1)][j-1]);        }    }}int query(int l,int r){    int k=(int)log2((double)r-l+1);    return max(mx[l][k],mx[r+1-(1<<k)][k]);}int main(){    cin>>n;    for(int i=1;i<=n;i++)    {        cin>>a[i];    }    RMQpre();    int l,r;    while(cin>>l>>r)    printf("%d\n",query(l,r));}