poj 3368 Frequent values

第一道RMQ就因为vector没有清空而WA了。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<vector>
 4 using namespace std;
 5 const int maxn=100000+5;
 6 vector<int> interval[maxn];
 7 int s[maxn];
 8 int value[maxn];
 9 int count[maxn];
10 int num[maxn];
11 int left[maxn];
12 int right[maxn];
13 int n,m;
14 int d[maxn][100];
15 int RMQ(int L,int R)
16 {
17     int k=0;
18     while((1<<(k+1))<=R-L+1) k++;
19     return max(d[L][k],d[R-(1<<k)+1][k]);
20 }
21 int main()
22 {
23     while(scanf("%d",&n)!=EOF&&n)
24     {
25          scanf("%d",&m);
26         memset(count,0,sizeof(count));
27         for(int i=0;i<n;i++)
28             interval[i].clear();
29         for(int i=0;i<n;i++)
30             scanf("%d",&s[i]);
31             int k=0;
32             value[0]=s[0];
33             count[0]++;
34             interval[0].push_back(0);
35         for(int i=1;i<n;i++)
36         {
37             if(s[i]==value[k])
38             {
39                 num[i]=k;
40                 count[k]++;
41                 interval[k].push_back(i);
42             }
43             else
44             {
45                 value[++k]=s[i];
46                 num[i]=k;
47                 count[k]++;
48                 interval[k].push_back(i);
49             }
50         }
51         int len=k+1;
52         for(int i=0;i<n;i++)
53         {
54             left[i]=interval[num[i]][0];
55             if(interval[num[i]].size()>1)
56                 right[i]=interval[num[i]][(int)interval[num[i]].size()-1];
57             else
58                 right[i]=left[i];
59         }
60         memset(d,0,sizeof(d));
61         for(int i=0;i<len;i++) d[i][0]=count[i];
62         for(int j=1;(1<<j)<=len;j++)
63             for(int i=0;i+(1<<j)-1<len;i++)
64              d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]);
65         for(int i=0;i<m;i++)
66         {
67             int L,R;
68             scanf("%d%d",&L,&R);
69             L--;R--;
70             if(num[L]==num[R])
71             {printf("%d\n",R-L+1);continue;}
72             int c=0;
73             int a=right[L]-L+1;
74             int b=R-left[R]+1;
75             if(left[R]-right[L]>1)
76             c=RMQ(num[L]+1,num[R]-1);
77             printf("%d\n",max(a,max(b,c)));
78         }
79     }
80     return 0;
81 }

 

posted @ 2013-08-17 18:29  sooflow  阅读(191)  评论(0编辑  收藏  举报