1 /************************************************************ 2 题目: Frequent values(poj 3368) 3 链接: http://poj.org/problem?id=3368 4 题意: 给出n个数和Q个询问(l,r),对于每个询问求出(l,r)之 5 间连续出现次数最多的次数 6 算法: RMQ 7 思路: 借助数组f[i]。表示第i位前面有f[i]个相同的数。对于 8 每个区间(l,r)。暴力求前面几个相同的数。然后在用RMQ 9 求后面区间的值。 10 *************************************************************/ 11 #include<cstdio> 12 #include<cstring> 13 #include<cstdlib> 14 #include<algorithm> 15 #include<iostream> 16 #include<cmath> 17 using namespace std; 18 19 const int mx=100005; 20 int dp[mx][30]; 21 int a[mx],f[mx]; 22 int n,q; 23 24 void makermq() 25 { 26 for (int i=1;i<=n;i++) dp[i][0]=f[i]; 27 for (int j=1;(1<<j)<=n;j++) 28 { 29 for (int i=1;i+(1<<j)-1<=n;i++) 30 { 31 dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]); 32 } 33 } 34 } 35 36 int rmq(int u,int v) 37 { 38 if (u>v) return 0; 39 int k=(int)(log(v-u+1)/log(2.0)); 40 return max(dp[u][k],dp[v-(1<<k)+1][k]); 41 } 42 43 int main() 44 { 45 while (~scanf("%d",&n)&&n) 46 { 47 scanf("%d",&q); 48 for (int i=1;i<=n;i++) scanf("%d",&a[i]); 49 f[1]=1; 50 for (int i=2;i<=n;i++) 51 { 52 if (a[i]==a[i-1]) f[i]=f[i-1]+1; 53 else f[i]=1; 54 } 55 makermq(); 56 57 while (q--) 58 { 59 int l,r; 60 scanf("%d%d",&l,&r); 61 int ans=1; 62 for (l=l+1;l<=r;l++) 63 { 64 if (a[l]!=a[l-1]) break; 65 ans++; 66 } 67 ans=max(ans,rmq(l,r)); 68 printf("%d\n",ans); 69 } 70 } 71 }