UVA - 11235:Frequent values

非常优美的RMQ问题,可以运到桶的思想

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#define MAXN 100000+10
#define LOG 20
#define pii pair<int,int>
using namespace std;
int a[MAXN];
int cnt[MAXN],left[MAXN],right[MAXN],tot;
int n,T;
int p[MAXN];
int d[MAXN][LOG];
void RMQ_init(){
    for(int i=1;i<=tot;i++){
        d[i][0]=cnt[i];
    }
    for(int j=1;j<LOG;j++){
        for(int i=1;i<=tot;i++){
            if(i+(1<<j)-1>tot)break;
            d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]);
        }    
    }
}
int RMQ(int x,int y){
    int len=y-x+1;
    int k=(int)(log(len*1.0)/log(2));
    k=max(k-2,0);
    while((1<<(k+1))<=len)k++;
    return max(d[x][k],d[y-(1<<k)+1][k]);
}
void solve(){
    memset(cnt,0,sizeof(cnt));
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        if(a[i]!=a[i-1]){
            right[tot]=i-1;
            tot++;
            left[tot]=i;
        }    
        p[i]=tot;
        cnt[tot]++;
    }
    right[tot]=n;
    RMQ_init();
    for(int i=1;i<=T;i++){
        int L,R;
        scanf("%d%d",&L,&R);
        if(p[L]==p[R]){
            printf("%d\n",R-L+1);
        }
        else{
            int ans=max(right[p[L]]-L+1,R-left[p[R]]+1);
            if(p[L]+1<=p[R]-1) ans=max(ans,RMQ(p[L]+1,p[R]-1));
            printf("%d\n",ans);
        }
    }    
}
int main()
{
//    freopen("data.in","r",stdin);
    while(1){
        scanf("%d%d",&n,&T);
        if(!n)break;
        solve();
    }
    return 0;
}

 

posted @ 2017-11-25 16:57  white_hat_hacker  阅读(117)  评论(0编辑  收藏  举报