RMQ模板

代码

int rmq[maxn][20],Lg[maxn];
void GetLg()
{
    Lg[0]=-1;
    for(int i=1;i<maxn;i++)
        Lg[i]=Lg[i-1]+(i&(i-1)?0:1);
}
int f(int x){ return 1<<x; }
void ST(int N)
{
    for(int i=0;i<N;i++) rmq[i][0]=A[i];
    for(int j=1;f(j)<=N;j++)
       for(int i=0;i+f(j)-1<N;i++)
        rmq[i][j]=max(rmq[i][j-1],rmq[i+f(j-1)][j-1]);
}
int RMQ(int x,int y)
{
    if(x>y) swap(x,y);
    int k=Lg[y-x+1];
    return max(rmq[x][k],rmq[y-f(k)+1][k]);
}
View Code

 

posted @ 2016-08-05 15:55  wust_ouyangli  阅读(95)  评论(0编辑  收藏  举报