分块大暴力,跟区间众数基本一样
1 #pragma GCC optimize(3) 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 using namespace std; 7 int n,c,m,sz=400,sz1; 8 int a[100100]; 9 int be[100100],st[251],ed[251]; 10 int nnm[251][100100]; 11 int ttt[100100],tt2[251][251]; 12 int main() 13 { 14 int i,j,k,l,r,lans=0,ans; 15 scanf("%d%d%d",&n,&c,&m); 16 //sz=sqrt(n); 17 sz1=(n-1)/sz+1; 18 for(i=1;i<=n;i++) scanf("%d",&a[i]),be[i]=(i-1)/sz+1; 19 for(i=1;i<sz1;i++) st[i]=(i-1)*sz+1,ed[i]=i*sz; 20 st[sz1]=(sz1-1)*sz+1,ed[sz1]=n; 21 for(i=1;i<=sz1;i++) 22 { 23 memcpy(nnm[i],nnm[i-1],sizeof(nnm[i])); 24 for(j=st[i];j<=ed[i];j++) nnm[i][a[j]]++; 25 } 26 for(i=1;i<=sz1;i++) 27 { 28 memset(ttt,0,sizeof(ttt));ans=0; 29 for(j=i;j<=sz1;j++) 30 { 31 for(k=st[j];k<=ed[j];k++) 32 { 33 if(ttt[a[k]]&&ttt[a[k]]%2==0) ans--; 34 ttt[a[k]]++; 35 if(ttt[a[k]]&&ttt[a[k]]%2==0) ans++; 36 } 37 tt2[i][j]=ans; 38 } 39 } 40 memset(ttt,0,sizeof(ttt)); 41 while(m--) 42 { 43 scanf("%d%d",&l,&r);l=(l+lans)%n+1;r=(r+lans)%n+1; 44 if(l>r) swap(l,r); 45 if(be[l]+1>=be[r]) 46 { 47 ans=0; 48 for(i=l;i<=r;i++) 49 { 50 if(ttt[a[i]]&&ttt[a[i]]%2==0) ans--; 51 ttt[a[i]]++; 52 if(ttt[a[i]]&&ttt[a[i]]%2==0) ans++; 53 } 54 printf("%d ",ans);lans=ans; 55 for(i=l;i<=r;i++) ttt[a[i]]--; 56 } 57 else 58 { 59 ans=tt2[be[l]+1][be[r]-1]; 60 for(i=l;i<=ed[be[l]];i++) 61 { 62 if(ttt[a[i]]+nnm[be[r]-1][a[i]]-nnm[be[l]][a[i]]&&(ttt[a[i]]+nnm[be[r]-1][a[i]]-nnm[be[l]][a[i]])%2==0) ans--; 63 ttt[a[i]]++; 64 if(ttt[a[i]]+nnm[be[r]-1][a[i]]-nnm[be[l]][a[i]]&&(ttt[a[i]]+nnm[be[r]-1][a[i]]-nnm[be[l]][a[i]])%2==0) ans++; 65 } 66 for(i=st[be[r]];i<=r;i++) 67 { 68 if(ttt[a[i]]+nnm[be[r]-1][a[i]]-nnm[be[l]][a[i]]&&(ttt[a[i]]+nnm[be[r]-1][a[i]]-nnm[be[l]][a[i]])%2==0) ans--; 69 ttt[a[i]]++; 70 if(ttt[a[i]]+nnm[be[r]-1][a[i]]-nnm[be[l]][a[i]]&&(ttt[a[i]]+nnm[be[r]-1][a[i]]-nnm[be[l]][a[i]])%2==0) ans++; 71 } 72 printf("%d ",ans);lans=ans; 73 for(i=l;i<=ed[be[l]];i++) ttt[a[i]]--; 74 for(i=st[be[r]];i<=r;i++) ttt[a[i]]--; 75 } 76 } 77 return 0; 78 }