洛谷 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

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

 

posted @ 2018-05-26 14:03  hehe_54321  阅读(240)  评论(0编辑  收藏  举报
AmazingCounters.com