poj 3368 rmq ***
题意:给出n个数和Q个询问(l,r),对于每个询问求出(l,r)之间连续出现次数最多的次数。
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const int INF=0x3f3f3f3f; 11 const double eps=1e-5; 12 typedef long long ll; 13 #define cl(a) memset(a,0,sizeof(a)) 14 #define ts printf("*****\n"); 15 int n,m,tt; 16 const int MAXN = 100005; 17 int dp[MAXN][20]; 18 int mm[MAXN]; 19 //初始化RMQ, b数组下标从1开始,从0开始简单修改 20 void initRMQ(int n,int b[]) 21 { 22 mm[0] = -1; 23 for(int i = 1; i <= n;i++) 24 { 25 mm[i] = ((i&(i-1)) == 0)?mm[i-1]+1:mm[i-1]; 26 dp[i][0] = b[i]; 27 } 28 for(int j = 1; j <= mm[n];j++) 29 for(int i = 1;i + (1<<j) -1 <= n;i++) 30 dp[i][j] = max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]); 31 } 32 //查询最大值 33 int rmq(int x,int y) 34 { 35 int k = mm[y-x+1]; 36 return max(dp[x][k],dp[y-(1<<k)+1][k]); 37 } 38 int a[MAXN],f[MAXN]; 39 int main() 40 { 41 int i,j,k; 42 #ifndef ONLINE_JUDGE 43 freopen("1.in","r",stdin); 44 #endif 45 while(scanf("%d",&n)!=EOF) 46 { 47 if(n==0) break; 48 scanf("%d",&m); 49 for(i=1;i<=n;i++) 50 { 51 scanf("%d",&a[i]); 52 f[1]=1; 53 if(i!=1) 54 { 55 if(a[i]==a[i-1]) 56 { 57 f[i]=f[i-1]+1; 58 } 59 else 60 f[i]=1; 61 } 62 } 63 /*for(i=1;i<=n;i++) 64 { 65 printf("%d ",f[i]); 66 } 67 printf("\n");*/ 68 initRMQ(n,f); 69 while(m--) 70 { 71 int uu,v; 72 scanf("%d%d",&uu,&v); 73 int u=uu; 74 while(u<=v&&a[u]==a[u-1]) 75 { 76 u++; 77 } 78 int ans=rmq(u,v); 79 ans=max(u-uu,ans); 80 printf("%d\n",ans); 81 } 82 } 83 }