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 }

 

posted on 2016-08-03 18:31  pb2016  阅读(200)  评论(0编辑  收藏  举报