和之前秘籍·反复异或那题一样,开了 O2 就全 wa 了。
#pragma GCC target("avx,avx2")
#include<bits/stdc++.h>
#include<immintrin.h>
using namespace std;
__m256i a[12505];
int p[100005];
int read()
{
int s=0;
char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s;
}
int ask(int l,int r,int x)
{
int s=0,i;
for(;(l-1&7)&&l<=r;l++)
s^=((int*)(a+(l>>3)+1))[(l&7)-1]+x;
if(l==r+1) return s;
for(;(r&7)&&l<=r;r--)
s^=((int*)(a+(r>>3)+1))[(r&7)-1]+x;
if(l==r+1) return s;
l=(l>>3)+1,r>>=3;
__m256i s2=_mm256_set_epi32(0,0,0,0,0,0,0,0);
__m256i x2=_mm256_set_epi32(x,x,x,x,x,x,x,x);
for(;l<=r;l++)
s2=_mm256_xor_si256(_mm256_add_epi32(a[l],x2),s2);
for(i=0;i<8;i++)
s^=((int*)&s2)[i];
return s;
}
int main()
{
int n,cnt=0,sum=0,i,j;
int x[10]={0};
n=read();
for(i=1;i<=n;i++)
p[i]=p[i-1]+read();
for(i=1;i<=(n>>3);i++)
{
for(j=0;j<8;j++)
x[j]=p[++cnt];
a[i]=_mm256_set_epi32(x[7],x[6],x[5],x[4],x[3],x[2],x[1],x[0]);
}
for(i=0;i<(n&7);i++)
x[i]=p[++cnt];
a[(n>>3)+1]=_mm256_set_epi32(x[7],x[6],x[5],x[4],x[3],x[2],x[1],x[0]);
for(i=0;i<n;i++)
sum^=ask(i+1,n,-p[i]);
cout<<sum;
}