RMQ poj 3264

poj 3264  Balanced Lineup

题目大意:对给定的区间求区间的最大最小值之差,利用RMQ,时间复杂度可降为O(nlog(n))

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <cmath>
using namespace std;
const int maxn=200000+10;
int n,q;
int  hmin[maxn][20],hmax[maxn][20];
int l,r;
inline int Min(int &a,int &b)
{
    return a<b?a:b;
}
inline int Max(int &a,int &b)
{
    return a>b?a:b;
}
void init()
{
    int k=(int)(log(n*1.0)/log(2.0));
    //printf("n->%d k->%d\n",n,k);
    for(int j=1;j<=k;j++)
    {
        for(int i=0;i+(1<<j)<=n;i++)
        {
            hmin[i][j]=Min(hmin[i][j-1],hmin[i+(1<<(j-1))][j-1]);
            hmax[i][j]=Max(hmax[i][j-1],hmax[i+(1<<(j-1))][j-1]);
            //printf("i->%d j->%d min->%d max->%d\n",i,j,hmin[i][j],hmax[i][j]);
        }
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    while(~scanf("%d%d",&n,&q))
    {
        for(int i=0;i<n;i++)
        {
            scanf("%d",&hmin[i][0]);
            hmax[i][0]=hmin[i][0];
        }
        init();
        int l,r,k,ans1,ans2;
        while(q--)
        {
            scanf("%d%d",&l,&r);
            l--,r--;
            k=(int )(log((r-l+1)*1.0)/log(2.0));
            ans1=Min(hmin[l][k],hmin[r-(1<<k)+1][k]);
            ans2=Max(hmax[l][k],hmax[r-(1<<k)+1][k]);
            printf("%d\n",ans2-ans1);
        }
    }
    return 0;
}

 

你可能感兴趣的:(poj)