标签:poj 3368 frequent values rmq+离散化
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 100005
int n,q;
int a[maxn],dp[maxn][30];
int value[maxn],cnt[maxn],l[maxn],r[maxn],has[maxn],ll[maxn],rr[maxn];
void init_rmq(int n){
for(int i=1;i<n;i++)dp[i][0]=cnt[i];
for(int j=1;(1<<j)<=n;j++)
for(int i=0;i+(1<<(j-1))-1<n;i++)
dp[i][j]=max(dp[i][j-1],dp[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(dp[l][k],dp[r-(1<<k)+1][k]);
}
int main()
{
int u,v;
//freopen("in.txt","r",stdin);
while(~scanf("%d",&n)&&n){
scanf("%d",&q);
scanf("%d",&a[1]);
int id=1;
memset(value,0,sizeof value);
memset(cnt,0,sizeof cnt);
value[id]=a[1];
cnt[id]++;
has[1]=id;
l[id]=1;
r[id]=1;
for(int i=2;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]==a[i-1]){
cnt[id]++;
}
else {
id++;
l[id]=i;
value[id]=a[i];
cnt[id]++;
}
has[i]=id;
r[id]=i;
}
for(int i=1;i<=n;i++){
ll[i]=l[has[i]];
rr[i]=r[has[i]];
}
/*
for(int i=1;i<=n;i++){
cout<<has[i]<<" ";
}
cout<<endl;
*/
init_rmq(id);
for(int i=0;i<q;i++){
scanf("%d%d",&u,&v);
if(has[u]==has[v])printf("%d\n",v-u+1);
else {
int max1=rr[u]-u+1; //若不设置ll[]的话,则直接用l[has[u]]即可
int max2=v-ll[v]+1;
int max3=0;
if(has[v]-has[u]>1){
max3=rmq(has[u]+1,has[v]-1);
}
printf("%d\n",max(max(max1,max2),max3));
}
}
}
}版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:poj 3368 frequent values rmq+离散化
原文地址:http://blog.csdn.net/u013497977/article/details/47374663