Frequent values UVA - 11235

#include<bits/stdc++.h>
#define IO ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
//#define int long long
using namespace std;
const int maxn=100000+5;
int d[maxn][32];
void RMQ_init(int *A,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)<=n;i++)
        d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]);
}
int RMQ(int L,int R)
{
    int k=0;
    while((1<<(k+1))<=R-L+1) k++;
    return max(d[L][k],d[R-(1<<k)+1][k]);
}
int a[maxn],val[maxn],cnt[maxn],num[maxn],l[maxn],r[maxn];
int32_t main()
{
    IO;
    int n,q,k;
    while(cin>>n&&n){
        cin>>q;
        k=0;
        memset(cnt,0,sizeof(cnt));
        for(int i=0;i<n;i++){
            cin>>a[i];
            if(!i) {
                cnt[k]=1;
                num[i]=k;
                l[i]=k;
                r[i]=i;
            }
            else {
                if(a[i]==a[i-1]){
                    cnt[k]++;
                    num[i]=k;
                    l[i]=l[i-1];
                }
                else {
                    for(int j=l[i-1];j<i;j++)
                        r[j]=i-1;
                    k++;
                    cnt[k]=1;
                    num[i]=k;
                    l[i]=i;
                    r[i]=i;
                }
            }
            if(i==n-1){
                if(a[i]==a[i-1]){
                    for(int j=l[i];j<n;j++)
                        r[j]=i-1;
                }
            }
        }
        k++;
        RMQ_init(cnt,k);
        int L,R;
        while(q--){
            cin>>L>>R;
        --L,--R;
        if(num[L]==num[R]) cout<<R-L+1<<endl;
        else {
            int ans=max(r[L]-L+1,R-l[R]+1);
            if(num[R]-num[L]>1) ans=max(ans,RMQ(num[L]+1,num[R]-1));
            cout<<ans<<endl;
        }
        }
    }

}

猜你喜欢

转载自www.cnblogs.com/033000-/p/10313719.html