POJ 3264 Balanced Lineup(ST表)

http://poj.org/problem?id=3264

RMQ问题,求每次询问的区间[L,R]中的最大值与最小值的差

可以用ST表解决;

#include<iostream>
#include<cstdio>
using namespace std;
const int N=5e5+10;
int log2[N];
int n,m,x,y,a[N],f[N][20],g[N][20];

void Init_RMQ()
{
    log2[1]=0;
    for(int i=2;i<N;i++)
      log2[i]=log2[i-1]+!(i&(i-1));
    for(int i=1;i<=n;i++)
      f[i][0]=g[i][0]=a[i];
    for(int j=1;(1<<j)<=n;j++)
      for(int i=1;i+(1<<j)-1<=n;i++)
      {
          f[i][j]=max(f[i][j-1],f[i+(1<<j-1)][j-1]);
          g[i][j]=min(g[i][j-1],g[i+(1<<j-1)][j-1]);
      }
}

int getmax(int l,int r)
{
    int k=log2[r-l+1];
    return max(f[l][k],f[r-(1<<k)+1][k]);
} 

int getmin(int l,int r)
{
    int k=log2[r-l+1];
    return min(g[l][k],g[r-(1<<k)+1][k]);
}

int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=1;i<=n;i++)
          scanf("%d",&a[i]);
        Init_RMQ();
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            printf("%d\n",getmax(x,y)-getmin(x,y)); 
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/feizaoSYUACM/article/details/81742219