书海扬帆的博客

权值树状数组维护每一位信息,统计得到最终答案。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
Author: Shuhaiyangfan
LANG: C++
PROG: [TJOI2017]Xor.cpp
Mail: me@ljhedp.cn
Blog: www.ljhedp.cn
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <iomanip>

using namespace std;
const double eps=1e-8;
const double pi=acos(-1.0);
const int INF=2147483647;
typedef long long ll;
template<class T>void read(T &x)
{
register int c = getchar(), f = 1;
x = 0;
while(!isdigit(c)) {
if (c == '-') f = -1;
c = getchar();
}
while(isdigit(c)) x = x * 10 + c - '0', c = getchar();
x *= f;
}
const int maxn=5000500;
int n,ans,a[maxn];
inline int lowbit(int x)
{
return x&(-x);
}
int tot,sum[maxn];
struct Tree {
int t[maxn];
inline void clear() {
memset(t,0,sizeof(t));
}
inline void add(int pos) {
while(pos<=tot) {
t[pos]++;
pos+=lowbit(pos);
}
}
inline int ask(int pos) {
int ret=0;
while(pos) {
ret+=t[pos];
pos-=lowbit(pos);
}
return ret;
}
}T_0,T_1;
int main() {
#ifdef win32
#define %lld %I64d
#endif
read(n);
for(int i=1;i<=n;i++) {
read(a[i]);
sum[i]=sum[i-1]+a[i];
}
tot=sum[n]+1;
//cout<<tot<<endl;
for(int i=0;(1<<i)<=tot;i++) {
T_0.clear();
T_1.clear();
int cnt=0;
T_0.add(1);
for(int j=1;j<=n;j++) {
int now=(sum[j]%(1<<i))+1;
if(((sum[j]>>i)&1)==1) {
cnt+=T_0.ask(now);
cnt+=T_1.ask(tot)-T_1.ask(now);
T_1.add(now);
}
else {
cnt+=T_1.ask(now);
cnt+=T_0.ask(tot)-T_0.ask(now);
T_0.add(now);
}
}
if(cnt&1) ans+=1<<i;
}
printf("%d\n",ans);
return 0;
}



本站使用 Material-X 作为主题 , 总访问量为 次 。
载入天数...载入时分秒... 字数统计:725.9k