RMQ模板

RMQ的模板,应该还是比较清晰易懂的,ma[i][j]的意思是从i开始到后面的2^j-1位中最大的数字。

#include<iostream>
#include<cstdio>
#define maxn 50001
using namespace std;
int ma[maxn][20],mi[maxn][20],n,m,a[maxn],l,r;
void rmq()
{
    for(int i=1;i<=n;i++)
        ma[i][0]=mi[i][0]=a[i];
    for(int j=1;(1<<j)<=n;j++)
        for(int i=1;i+(1<<j)-1<=n;i++)
        {
            ma[i][j]=max(ma[i][j-1],ma[i+(1<<(j-1))][j-1]);    
            mi[i][j]=min(mi[i][j-1],mi[i+(1<<(j-1))][j-1]);    
        }    
}
int sum(int l,int r)
{
    int k=0,len=r-l+1;
    while((1<<(k))<=len)
        k++;
    k--;
    int maa,mii;
    maa=max(ma[l][k],ma[r-(1<<k)+1][k]);//很神奇 区间重复没有关系。。。 
    mii=min(mi[l][k],mi[r-(1<<k)+1][k]);
    return maa-mii;
}
main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    rmq();
    for(int i=1;i<=m;i++)
    {
        cin>>l>>r;
        cout<<sum(l,r)<<endl;
    }
}

 

posted @ 2017-08-18 11:11  cc123321  阅读(166)  评论(0编辑  收藏  举报