题目:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=501&page=show_problem&problem=2176
分析:RMQ问题 《训练指南》P198
代码:
#include <cstdio>
#include <algorithm>
using namespace std;
const int Tmax=100005;
int n,q,value[Tmax],Tcount[Tmax],num[Tmax],left[Tmax],right[Tmax],RMQ_array[Tmax][20],_max,k;
void RMQ(int l,int r)
{
if(num[l]==num[r]) {
printf("%d\n",r-l+1);
return;
}
_max=0;
_max=max(_max,right[l]-l+1);
_max=max(_max,r-left[r]+1);
if(num[r]-1-num[l]>0){
k=0;
while((1<<(k+1)<=num[r]-1-num[l])) k++;
_max=max(_max,RMQ_array[num[l]+1][k]);
_max=max(_max,RMQ_array[num[r]-(1<<(k))][k]);
}
printf("%d\n",_max);
return ;
}
void RMQ_init()
{
int i,j;
for(i=1;i<=value[0];i++)
RMQ_array[i][0]=Tcount[i];
for(j=1;(1<<j)<=value[0];j++)
for(i=1;i+(1<<j)-1<=value[0];i++)
RMQ_array[i][j]=max(RMQ_array[i][j-1],RMQ_array[i+(1<<(j-1))][j-1]);
return;
}
int main()
{
int i,a,l,r;
while(scanf("%d",&n)==1&&n)
{
scanf("%d",&q);
for(i=1;i<=n;i++)
{
scanf("%d",&a);
if(a!=value[value[0]]){
value[++value[0]]=a;
Tcount[value[0]]++;
num[i]=value[0];
left[i]=i;
}
else {
Tcount[value[0]]++;
num[i]=value[0];
left[i]=i-Tcount[value[0]]+1;
}
}
for(i=1;i<=n;i++)
right[i]=left[i]+Tcount[num[i]]-1;
RMQ_init();
for(i=1;i<=q;i++)
{
scanf("%d %d",&l,&r);
RMQ(l,r);
}
}
return 0;
}