题意:给出一个非降序排列的整数数组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; }