bzoj 2724[Violet 6]蒲公英
2724: [Violet 6]蒲公英
Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 2630 Solved: 920
[Submit][Status][Discuss]
Description
Input
修正一下
l = (l_0 + x - 1) mod n + 1, r = (r_0 + x - 1) mod n + 1
Output
Sample Input
6 3
1 2 3 2 1 2
1 5
3 6
1 5
1 2 3 2 1 2
1 5
3 6
1 5
Sample Output
1
2
1
2
1
HINT
修正下:
n <= 40000, m <= 50000
//区间众数 比较经典的做法 据说可以离散莫队做 但是一直没想出怎么转移 参考了黄学长的博客 知道了可以预处理一些东西 强行将复杂度降为n*sqrt(n) 只要 //预处理出i-j块的区间众数和数量 然后暴力查询该区间边缘最多2*sqrt(n)个数 判断是否对块区间众数是否产生影响 进而得出答案....重点别忘记初始化 /************************************************************** Problem: 2724 User: c20161007 Language: C++ Result: Accepted Time:3180 ms Memory:34644 kb ****************************************************************/ #include <bits/stdc++.h> #define ll long long #define N 40005 using namespace std; ll readll(){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int readint(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch))x=x*10+ch-'0',ch=getchar(); return f*x; } int p[N],a[N],size,n,m; vector<int>vec; int kind[205][205]; int num[205][205]; int sum[205][N]; int jishu[N]; int ans;int ans1; void advance(int t){ for(int i=1;i<=p[n];i++){ for(int j=1;j<=t;j++) sum[i][j]=sum[i-1][j]; for(int j=(i-1)*size+1;j<=min(n,size*i);j++) sum[i][a[j]]++; } // for(int i=1;i<=p[n];i++){ // for(int j=(i-1)*size+1;j<=min(n,size*i);j++){ // cout<<a[j]<<" "; // } // cout<<endl; // for(int j=1;j<=t;j++){ // cout<<i<<" "<<sum[i][j]<<endl; // } // } for(int i=1;i<=p[n];i++){ num[i][i]=-1; for(int j=(i-1)*size+1;j<=min(n,i*size);j++){ int tp=sum[i][a[j]]-sum[i-1][a[j]]; if(tp>=num[i][i]){ if(tp==num[i][i]) kind[i][i]=min(kind[i][i],a[j]); else kind[i][i]=a[j]; num[i][i]=tp; } } for(int j=i+1;j<=p[n];j++){ num[i][j]=num[i][j-1];kind[i][j]=kind[i][j-1]; for(int k=(j-1)*size+1;k<=min(n,size*j);k++){ int tp=sum[j][a[k]]-sum[i-1][a[k]]; if(tp>=num[i][j]){ if(tp==num[i][j]) kind[i][j]=min(kind[i][j],a[k]); else kind[i][j]=a[k]; num[i][j]=tp; } } } } } void update(int l,int r){ for(int i=l;i<=size*p[l];i++){ jishu[a[i]]++; if(jishu[a[i]]>=ans){ if(jishu[a[i]]==ans) ans1=min(ans1,a[i]); else ans1=a[i]; ans=jishu[a[i]]; } } for(int i=(p[r]-1)*size+1;i<=r;i++){ jishu[a[i]]++; if(jishu[a[i]]>=ans){ if(jishu[a[i]]==ans) ans1=min(ans1,a[i]); else ans1=a[i]; ans=jishu[a[i]]; } } for(int i=l;i<=size*p[l];i++) jishu[a[i]]=0; for(int i=(p[r]-1)*size+1;i<=r;i++) jishu[a[i]]=0; } int slove(int l,int r){ ans=-1; if(p[l]==p[r]){ for(int i=l;i<=r;i++){ jishu[a[i]]++; if(jishu[a[i]]>=ans){ if(jishu[a[i]]==ans) ans1=min(ans1,a[i]); else ans1=a[i]; ans=jishu[a[i]]; } } for(int i=l;i<=r;i++) jishu[a[i]]=0; return ans1; } if(p[r]-p[l]==1){ update(l,r); return ans1; } ans=num[p[l]+1][p[r]-1];ans1=kind[p[l]+1][p[r]-1]; for(int i=l;i<=size*p[l];i++) jishu[a[i]]=sum[p[r]-1][a[i]]-sum[p[l]][a[i]]; for(int i=(p[r]-1)*size+1;i<=r;i++) jishu[a[i]]=sum[p[r]-1][a[i]]-sum[p[l]][a[i]]; update(l,r); return ans1; } int main(){ ios::sync_with_stdio(false); n=readint();m=readint();size=(int)sqrt(n); for(int i=1;i<=n;i++){ a[i]=readint();p[i]=(i-1)/size+1; vec.push_back(a[i]); } // cout<<size<<endl; sort(vec.begin(),vec.end()); int t=unique(vec.begin(),vec.end())-vec.begin(); for(int i=1;i<=n;i++) a[i]=lower_bound(vec.begin(),vec.begin()+t,a[i])-vec.begin()+1; advance(t);int Lans=0;int l,r; for(int i=1;i<=m;i++){ l=readint();r=readint(); l=(l+Lans-1)%n+1;r=(r+Lans-1)%n+1; if(l>r) swap(l,r); Lans=vec[slove(l,r)-1]; printf("%d\n",Lans); } return 0; }