http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23846
游程编码(RunLength Encoding) RLE, Spares-Table
动态询问数组中出现最多的值的出现次数
/*************************************************************************
> File Name: UVa11235.cpp
> Author:HaoWei
> Mail:liang199611@outlook.com
> Created Time: 2016年06月29日 星期三 15时24分53秒
************************************************************************/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=111111;
#define rep(i,n) for(int i=0;i<n;i++)
int a[maxn],n,cnt,q;
int kount[maxn],id[maxn],ll[maxn],rr[maxn];
int d[maxn][22];
void RMQ_init(int n)
{
rep(i,n) d[i][0]=kount[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 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 main()
{
while(scanf("%d%d",&n,&q)==2)
{
if(!n) break;
rep(i,n) scanf("%d",&a[i]);
memset(ll,-1,sizeof(ll));memset(rr,-1,sizeof(rr));
cnt=0;
rep(i,n){
if(i==0) kount[cnt]=1,ll[i]=0;
else if(a[i]!=a[i-1]) kount[++cnt]=1,rr[i-1]=i-1,ll[i]=i;
else kount[cnt]++;
id[i]=cnt;
}
rr[n-1]=n-1;cnt++;
for(int i=0;i<n;i++) if(i!=0&&ll[i]==-1) ll[i]=ll[i-1];
for(int i=n-1;i>=0;i--) if(i!=(n-1)&&rr[i]==-1) rr[i]=rr[i+1];
RMQ_init(cnt);
/* rep(i,n) printf(" id:%d ll:%d rr:%d",id[i],ll[i],rr[i]);
cout<<endl;
rep(i,cnt) printf("count:%d ",kount[i]);*/
rep(tt,q)
{
int L,R,l,r,res;
scanf("%d%d",&L,&R);L--,R--;
// printf("\nrr[L]:%d,L:%d,R:%d,ll[R]:%d\n",rr[L],L,R,ll[R]);
//L=id[L];R=id[R];
l=id[L]+1;r=id[R]-1;
if(id[L]==id[R]) {printf("%d\n",R-L+1);continue;}
res=max(rr[L]-L+1,R-ll[R]+1);
// printf("\nleft:%d right:%d\n",l,r);
if(r>=l) res=max(res,RMQ(l,r));
printf("%d\n",res);
}
}
return 0;
}