1. 程式人生 > >Frequent values UVA - 11235

Frequent values UVA - 11235

base uva ans std long rmq sin req ase

#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; } } } }

Frequent values UVA - 11235