洛谷 P4168 [Violet]蒲公英
https://www.luogu.org/problemnew/show/P4168
分块大暴力
错误记录:66,82行lans=ans.b
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 #include<tr1/unordered_map> 6 using namespace std; 7 using namespace tr1; 8 struct D 9 { 10 int a,b; 11 D(){} 12 D(int x,int y):a(x),b(y){} 13 }; 14 bool operator<(const D &a,const D &b) {return a.a<b.a||(a.a==b.a&&a.b>b.b);} 15 int n,c,m,sz=200,sz1; 16 int a[40100]; 17 int be[40100],st[202],ed[202]; 18 int nnm[202][40100]; 19 int ttt[40100]; 20 D tt2[202][202]; 21 unordered_map<int,int> ma; 22 int tt[40100]; 23 int main() 24 { 25 int i,j,k,l,r,lans=0;D ans; 26 scanf("%d%d",&n,&m); 27 //sz=sqrt(n); 28 sz1=(n-1)/sz+1; 29 for(i=1;i<=n;i++) scanf("%d",&a[i]),be[i]=(i-1)/sz+1,tt[++tt[0]]=a[i]; 30 for(i=1;i<sz1;i++) st[i]=(i-1)*sz+1,ed[i]=i*sz; 31 st[sz1]=(sz1-1)*sz+1,ed[sz1]=n; 32 sort(tt+1,tt+tt[0]+1);tt[0]=unique(tt+1,tt+tt[0]+1)-tt-1; 33 for(i=1;i<=tt[0];i++) ma[tt[i]]=i; 34 for(i=1;i<=n;i++) a[i]=ma[a[i]]; 35 for(i=1;i<=sz1;i++) 36 { 37 memcpy(nnm[i],nnm[i-1],sizeof(nnm[i])); 38 for(j=st[i];j<=ed[i];j++) nnm[i][a[j]]++; 39 } 40 for(i=1;i<=sz1;i++) 41 { 42 memset(ttt,0,sizeof(ttt));ans=D(0,0); 43 for(j=i;j<=sz1;j++) 44 { 45 for(k=st[j];k<=ed[j];k++) 46 { 47 ttt[a[k]]++; 48 ans=max(ans,D(ttt[a[k]],a[k])); 49 } 50 tt2[i][j]=ans; 51 } 52 } 53 memset(ttt,0,sizeof(ttt)); 54 while(m--) 55 { 56 scanf("%d%d",&l,&r);l=(l+lans-1)%n+1;r=(r+lans-1)%n+1; 57 if(l>r) swap(l,r); 58 if(be[l]+1>=be[r]) 59 { 60 ans=D(0,0); 61 for(i=l;i<=r;i++) 62 { 63 ttt[a[i]]++; 64 ans=max(ans,D(ttt[a[i]],a[i])); 65 } 66 printf("%d\n",tt[ans.b]);lans=tt[ans.b]; 67 for(i=l;i<=r;i++) ttt[a[i]]--; 68 } 69 else 70 { 71 ans=tt2[be[l]+1][be[r]-1]; 72 for(i=l;i<=ed[be[l]];i++) 73 { 74 ttt[a[i]]++; 75 ans=max(ans,D(ttt[a[i]]+nnm[be[r]-1][a[i]]-nnm[be[l]][a[i]],a[i])); 76 } 77 for(i=st[be[r]];i<=r;i++) 78 { 79 ttt[a[i]]++; 80 ans=max(ans,D(ttt[a[i]]+nnm[be[r]-1][a[i]]-nnm[be[l]][a[i]],a[i])); 81 } 82 printf("%d\n",tt[ans.b]);lans=tt[ans.b]; 83 for(i=l;i<=ed[be[l]];i++) ttt[a[i]]--; 84 for(i=st[be[r]];i<=r;i++) ttt[a[i]]--; 85 } 86 } 87 return 0; 88 }
额外:
loj #6285. 数列分块入门 9
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 #include<tr1/unordered_map> 6 using namespace std; 7 using namespace tr1; 8 struct D 9 { 10 int a,b; 11 D(){} 12 D(int x,int y):a(x),b(y){} 13 }; 14 bool operator<(const D &a,const D &b) {return a.a<b.a||(a.a==b.a&&a.b>b.b);} 15 int n,c,m,sz=300,sz1; 16 int a[100100]; 17 int be[100100],st[340],ed[340]; 18 int nnm[340][100100]; 19 int ttt[100100]; 20 D tt2[340][340]; 21 unordered_map<int,int> ma; 22 int tt[100100]; 23 int main() 24 { 25 int i,j,k,l,r,lans=0;D ans; 26 scanf("%d",&n);m=n; 27 //sz=sqrt(n); 28 sz1=(n-1)/sz+1; 29 for(i=1;i<=n;i++) scanf("%d",&a[i]),be[i]=(i-1)/sz+1,tt[++tt[0]]=a[i]; 30 for(i=1;i<sz1;i++) st[i]=(i-1)*sz+1,ed[i]=i*sz; 31 st[sz1]=(sz1-1)*sz+1,ed[sz1]=n; 32 sort(tt+1,tt+tt[0]+1);tt[0]=unique(tt+1,tt+tt[0]+1)-tt-1; 33 for(i=1;i<=tt[0];i++) ma[tt[i]]=i; 34 for(i=1;i<=n;i++) a[i]=ma[a[i]]; 35 for(i=1;i<=sz1;i++) 36 { 37 memcpy(nnm[i],nnm[i-1],sizeof(nnm[i])); 38 for(j=st[i];j<=ed[i];j++) nnm[i][a[j]]++; 39 } 40 for(i=1;i<=sz1;i++) 41 { 42 memset(ttt,0,sizeof(ttt));ans=D(0,0); 43 for(j=i;j<=sz1;j++) 44 { 45 for(k=st[j];k<=ed[j];k++) 46 { 47 ttt[a[k]]++; 48 ans=max(ans,D(ttt[a[k]],a[k])); 49 } 50 tt2[i][j]=ans; 51 } 52 } 53 memset(ttt,0,sizeof(ttt)); 54 while(m--) 55 { 56 scanf("%d%d",&l,&r);//l=(l+lans-1)%n+1;r=(r+lans-1)%n+1; 57 if(l>r) swap(l,r); 58 if(be[l]+1>=be[r]) 59 { 60 ans=D(0,0); 61 for(i=l;i<=r;i++) 62 { 63 ttt[a[i]]++; 64 ans=max(ans,D(ttt[a[i]],a[i])); 65 } 66 printf("%d\n",tt[ans.b]);lans=tt[ans.b]; 67 for(i=l;i<=r;i++) ttt[a[i]]--; 68 } 69 else 70 { 71 ans=tt2[be[l]+1][be[r]-1]; 72 for(i=l;i<=ed[be[l]];i++) 73 { 74 ttt[a[i]]++; 75 ans=max(ans,D(ttt[a[i]]+nnm[be[r]-1][a[i]]-nnm[be[l]][a[i]],a[i])); 76 } 77 for(i=st[be[r]];i<=r;i++) 78 { 79 ttt[a[i]]++; 80 ans=max(ans,D(ttt[a[i]]+nnm[be[r]-1][a[i]]-nnm[be[l]][a[i]],a[i])); 81 } 82 printf("%d\n",tt[ans.b]);lans=tt[ans.b]; 83 for(i=l;i<=ed[be[l]];i++) ttt[a[i]]--; 84 for(i=st[be[r]];i<=r;i++) ttt[a[i]]--; 85 } 86 } 87 return 0; 88 }