hdu 1806 Frequent values rmq+游标编码

白书P198

#include<bits/stdc++.h>
using namespace std;

const int MAXN=100000+5;
int a[MAXN],va[MAXN],num[MAXN],L[MAXN],R[MAXN];
int d[MAXN][20];

void rmq_max(int n)
{
    for(int i=0;i<n;i++) d[i][0]=a[i];
    for(int j=1;(1<<j)<=n;j++)
        for(int i=0;i+(1<<j)-1<n;i++)
            d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]);
}

int rmq(int u,int v)
{
    int k=0;
    int ret,l,r;
    if(num[u]==num[v]) return (v-u+1);
    l=num[u]+1;
    r=num[v]-1;
    ret=max(R[u]-u+1,v-L[v]+1);
    if(r<l) return ret;
    else if(r==l) return max(ret,a[l]);

    while((1<<(k+1))<=r-l+1) k++;
    ret=max(ret,max(d[l][k],d[r-(1<<k)+1][k]));
    return ret;
}

int main()
{
    int n,m,i,j,u,v,tp,t,ncnt,vcnt;
    while(~scanf("%d",&n))
    {
        if(n==0) break;
        scanf("%d",&m);
        vcnt=0;
        ncnt=1;
        for(i=0;i<n;i++)
        {
            scanf("%d",&t);
            if(i==0)
                tp=t;
            else if(tp==t)
                ncnt++;
            else
            {
                va[vcnt]=tp;
                a[vcnt]=ncnt;
                vcnt++;
                tp=t;
                ncnt=1;
            }
        }
        va[vcnt]=tp;
        a[vcnt++]=ncnt;
        //for(i=0;i<vcnt;i++) printf("%d %d\n",va[i],a[i]);
        tp=0;
        for(i=0;i<vcnt;i++)
        {
            for(j=tp;j<tp+a[i];j++)
            {
                num[j]=i;
                L[j]=tp;
                R[j]=tp+a[i]-1;
            }
            tp+=a[i];
        }
        rmq_max(vcnt);
        //for(i=0;i<n;i++) printf("%d %d %d\n",num[i],L[i],R[i]);
        for(j=0;j<m;j++)
        {
            scanf("%d%d",&u,&v);
            printf("%d\n",rmq(u-1,v-1));
        }
    }
    return 0;
}

你可能感兴趣的:(hdu 1806 Frequent values rmq+游标编码)