2019.3.23考试

睿智场

T1 不知道哪来的神仙题,机房集体咕咕了

T2 因为是随机的所以搞类似缓冲区的东西放在中间

不想写了 看i207M的吧

或者直接平衡树维护中间大概1e4个也行

Upd:orz lhw

T3 打表找SG的规律,发现p是奇数是奇偶性,p是偶数除了模p+1是p的是2,其他的都是奇偶性

前者线段树,后者分块

分块麻烦(其实是只剩半个小时没时间了),考场循环展开+优化水过

  1 #pragma GCC optimize("O2,Ofast,inline")
  2 #include<cstdio>
  3 #include<cctype>
  4 #include<cstring>
  5 #include<algorithm>
  6 #include<unordered_map>
  7 #define uint unsigned int
  8 using namespace std;
  9 const int N=400005;
 10 uint n,m,p,k,op,tot;
 11 uint a[N],val[N],laz[N],ans[N];
 12 
 13 char BF[1<<23],*P1=BF,*P2=BF;
 14 char Gc(){return (P1==P2&&(P2=(P1=BF)+fread(BF,1,1<<21,stdin),P1==P2)?EOF:*P1++);}
 15 void Read(uint &x)
 16 {
 17     x=0; char ch=Gc();
 18     while(!isdigit(ch)) ch=Gc();
 19     while(isdigit(ch)) x=((x<<3)+(x<<1)+(ch^48))%(p+1),ch=Gc();
 20 }
 21 void R(uint &x)
 22 {
 23     x=0; char ch=Gc();
 24     while(!isdigit(ch)) ch=Gc();
 25     while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=Gc();
 26 }
 27 char OBF[1<<23],*Ot=OBF;
 28 void W(uint x) 
 29 {
 30     if(x>9) W(x/10);
 31     *Ot++=x%10|48;
 32 }
 33 
 34 void Create(int nde,int l,int r)
 35 {
 36     if(l==r)
 37         val[nde]=a[l];
 38     else
 39     {
 40         int mid=(l+r)>>1,ls=2*nde,rs=2*nde+1;
 41         Create(ls,l,mid),Create(rs,mid+1,r);
 42         val[nde]=val[ls]^val[rs];
 43     }
 44 }
 45 void Release(int nde,int l,int r)
 46 {
 47     if(laz[nde])
 48     {
 49         uint &lz=laz[nde];
 50         int mid=(l+r)>>1,ls=2*nde,rs=2*nde+1;
 51         val[ls]^=((mid-l+1)&1),val[rs]^=((r-mid)&1);
 52         laz[ls]^=1,laz[rs]^=1,lz=0;
 53     }
 54 }
 55 void Modify(int nde,int l,int r,int ll,int rr)
 56 {
 57     if(l>rr||r<ll)
 58         return;
 59     else if(l>=ll&&r<=rr)
 60         val[nde]^=((r-l+1)&1),laz[nde]^=1;
 61     else
 62     {
 63         int mid=(l+r)>>1,ls=2*nde,rs=2*nde+1; Release(nde,l,r);
 64         Modify(ls,l,mid,ll,rr),Modify(rs,mid+1,r,ll,rr),val[nde]=val[ls]^val[rs];
 65     }
 66 }
 67 uint Query(int nde,int l,int r,int ll,int rr)
 68 {
 69     if(l>rr||r<ll)
 70         return 0;
 71     else if(l>=ll&&r<=rr)
 72         return val[nde];
 73     else
 74     {
 75         int mid=(l+r)>>1,ls=2*nde,rs=2*nde+1; Release(nde,l,r);
 76         return Query(ls,l,mid,ll,rr)^Query(rs,mid+1,r,ll,rr);
 77     }
 78 }
 79 void Sol1()
 80 {
 81     uint t1,t2,t3;
 82     const int nn=n,mm=m;
 83     for(int i=1;i<=nn;i++) R(a[i]),a[i]&=1;
 84     Create(1,1,nn);
 85     for(int i=1;i<=mm;i++)
 86     {
 87         R(op);
 88         if(!op)
 89         {
 90             R(t1),R(t2),R(t3);
 91             if(t3&1) Modify(1,1,n,t1,t2);
 92         }
 93         else
 94         {
 95             R(t1),R(t2);
 96             ans[++tot]=Query(1,1,n,t1,t2); 
 97         }
 98     }
 99 }
100 
101 void Sol2()
102 {
103     register int i,j; 
104     const int nn=n,mm=m; 
105     const uint mod=p+1,md=p;
106     for(i=1;i<=nn;i++) Read(a[i]);
107     for(i=1;i<=mm;i++)
108     {
109         R(op);
110         if(!op)
111         {
112             uint t1,t2,ad;
113             R(t1),R(t2),Read(ad);
114             const int lim=t2,lm=t2-8; const uint t3=ad;
115             for(j=t1;j<=lm;j+=8)
116             {
117                 int n1=j+1,n2=j+2,n3=j+3,n4=j+4,n5=j+5,n6=j+6,n7=j+7;
118                 a[j]=(a[j]+t3>=mod)?(a[j]+t3-mod):(a[j]+t3);
119                 a[n1]=(a[n1]+t3>=mod)?(a[n1]+t3-mod):(a[n1]+t3);
120                 a[n2]=(a[n2]+t3>=mod)?(a[n2]+t3-mod):(a[n2]+t3);
121                 a[n3]=(a[n3]+t3>=mod)?(a[n3]+t3-mod):(a[n3]+t3);
122                 a[n4]=(a[n4]+t3>=mod)?(a[n4]+t3-mod):(a[n4]+t3);
123                 a[n5]=(a[n5]+t3>=mod)?(a[n5]+t3-mod):(a[n5]+t3);
124                 a[n6]=(a[n6]+t3>=mod)?(a[n6]+t3-mod):(a[n6]+t3);
125                 a[n7]=(a[n7]+t3>=mod)?(a[n7]+t3-mod):(a[n7]+t3);
126             }
127             while(j<=lim) 
128             {
129                 a[j]+=t3;
130                 if(a[j]>=mod) a[j]-=mod; ++j;
131             }
132         }
133         else
134         {
135             uint t1,t2;
136             R(t1),R(t2); 
137             const int lim=t2,lm=t2-8;
138             uint ss=0,s1=0,s2=0,s3=0,s4=0,s5=0,s6=0,s7=0;
139             for(j=t1;j<=lm;j+=8)
140             {
141                 int n1=j+1,n2=j+2,n3=j+3,n4=j+4,n5=j+5,n6=j+6,n7=j+7;
142                 ss^=((a[j]^md)?(a[j]&1):2);
143                 s1^=((a[n1]^md)?(a[n1]&1):2);
144                 s2^=((a[n2]^md)?(a[n2]&1):2);
145                 s3^=((a[n3]^md)?(a[n3]&1):2);
146                 s4^=((a[n4]^md)?(a[n4]&1):2);
147                 s5^=((a[n5]^md)?(a[n5]&1):2);
148                 s6^=((a[n6]^md)?(a[n6]&1):2);
149                 s7^=((a[n7]^md)?(a[n7]&1):2);
150             }
151             while(j<=lim) {ss^=((a[j]==md)?2:(a[j]&1));++j;}
152             ans[++tot]=(bool)(ss^s1^s2^s3^s4^s5^s6^s7);
153         }
154     }
155 }
156 
157 int main()
158 {
159     register uint i;
160     R(n),R(m),R(p);
161     if(p&1) Sol1(); else Sol2();
162     for(i=1;i<=tot;i++)
163     {
164         W(ans[i]);
165         if(i!=tot) *Ot++='
';
166     }
167     fwrite(OBF,Ot-OBF,1,stdout);
168     return 0;
169 }
View Code
原文地址:https://www.cnblogs.com/ydnhaha/p/10584560.html