洛谷 P4135 作诗

分块大暴力,跟区间众数基本一样

 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\n",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\n",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 }

 

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