uva 11235 - Frequent values(RMQ问题)

来源:互联网 发布:粮食安全 大数据 编辑:程序博客网 时间:2024/05/22 05:11

题意:给出一个非降序排列的整数数组a1,a2,。。。an,你的任务是对于一系列询问(i,j),回答ai,ai+1,。。。,aj中出现次数最多的值所出现的次数。

#include<iostream>#include<cstdio>#include<cstring>#define mx 100000+10#define max(x,y) (x)>(y) ? (x) : (y)using namespace std;int n,m,d[mx][18];int a[mx],count[mx],num[mx],l[mx],r[mx];void init(){int i,j;for(i=0;i<m;i++) d[i][0]=count[i];for(j=1;1<<j<=m;j++)for(i=0;i+(1<<j)<=m;i++)d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]);}int rmq(int x,int y){if(x>y) return 0;int k=0;while((1<<(k+1))<y-x+1) k++;return max(d[x][k],d[y-(1<<k)+1][k]);}int main(){int i,j,q,res;while(scanf("%d",&n)!=EOF && n){scanf("%d",&q);memset(count,0,sizeof(count));for(i=0,m=0;i<n;i++) {scanf("%d",&a[i]);if(i==0 || a[i]>a[i-1]) {l[m++]=i;if(i) r[m-2]=i-1;}num[i]=m-1;count[m-1]++;}r[m-1]=i-1;init();while(q--){scanf("%d%d",&i,&j);i--;j--;if(num[i]==num[j]){printf("%d\n",j-i+1);continue;}res=rmq(num[i]+1,num[j]-1);res=max(res,r[num[i]]-i+1);printf("%d\n",max(res,j-l[num[j]]+1));}}return 0;}