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 }