1. 程式人生 > >洛谷 P4168 [Violet]蒲公英

洛谷 P4168 [Violet]蒲公英

target emc cli nbsp SQ 技術分享 violet n+1 operator

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

https://loj.ac/problem/6285

技術分享圖片
 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 }
View Code

洛谷 P4168 [Violet]蒲公英