#include <bits/stdc++.h>
#define all(i) (i).begin(), (i).end()
#define debug(x) cerr << "Line(" << __LINE__ << ") -> " << #x << " is " << x << endl
using namespace std;
template<typename T1, typename T2>
ostream& operator << (ostream &i, pair<T1, T2> j) {
return i << j.first << ' ' << j.second;
}
template<typename T>
ostream& operator << (ostream &i, vector<T> j) {
i << '{' << j.size() << ':';
for (T ii : j) i << ' ' << ii;
return i << '}';
}
typedef long long ll;
typedef pair<int, int> pi;
typedef pair<pi, int> pp;
int main() {
ios::sync_with_stdio(0), cin.tie(0);
int n;
cin >> n;
int a[n];
for (int &i : a) cin >> i;
int ans = 0;
for (int i = 0; i < 20; ++i) {
int x = (1 << i + 1) - 1, cnt[x + 1]{};
ll tmp = 0;
for (int j : a) ++cnt[j & x];
for (int j = 1; j < 1 << i; ++j) cnt[j] += cnt[j - 1];
for (int j = (1 << i) + 1; j < 1 << i + 1; ++j) cnt[j] += cnt[j - 1];
for (int j : a) {
j &= x;
if (j << 1 & 1 << i) ++tmp;
if (j >> i & 1) {
tmp += cnt[x - j];
tmp += cnt[x] - cnt[x + (1 << i) - j];
}
else {
tmp += cnt[x >> 1] - cnt[(x >> 1) - j];
tmp += cnt[x - j];
}
}
if (tmp & 2) ans ^= 1 << i;
}
for (int i = 20; i < 30; ++i) {
int x = (1 << i + 1) - 1;
map<int, int> cnt, pre;
ll tmp = 0;
for (int j : a) ++cnt[j & x];
int s = 0;
bool b = false;
for (pi j : cnt) {
if (!b && j.first >> i & 1) b = true, s = 0;
s += j.second, pre[j.first] = s;
}
auto calc = [&](int j) {
auto it = pre.lower_bound(j + 1);
if (it == pre.begin()) return 0;
--it;
if (j >> i & 1 && ~(it->first) >> i & 1) return 0;
return it->second;
};
for (int j : a) {
j &= x;
if (j << 1 & 1 << i) ++tmp;
if (j >> i & 1) {
tmp += calc(x - j);
tmp += calc(x) - calc(x + (1 << i) - j);
}
else {
tmp += calc(x >> 1) - calc((x >> 1) - j);
tmp += calc(x - j);
}
}
if (tmp & 2) ans ^= 1 << i;
}
cout << ans;
}
/*
*
*
*
*
*/
Compilation message
xorsum.cpp: In function 'int main()':
xorsum.cpp:26:25: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
26 | int x = (1 << i + 1) - 1, cnt[x + 1]{};
| ~~^~~
xorsum.cpp:30:47: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
30 | for (int j = (1 << i) + 1; j < 1 << i + 1; ++j) cnt[j] += cnt[j - 1];
| ~~^~~
xorsum.cpp:46:25: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
46 | int x = (1 << i + 1) - 1;
| ~~^~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
34 ms |
4688 KB |
Output is correct |
2 |
Correct |
35 ms |
4684 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
1682 ms |
8684 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
1682 ms |
8684 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
34 ms |
4688 KB |
Output is correct |
2 |
Correct |
35 ms |
4684 KB |
Output is correct |
3 |
Correct |
1255 ms |
14132 KB |
Output is correct |
4 |
Correct |
1271 ms |
14252 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
34 ms |
4688 KB |
Output is correct |
2 |
Correct |
35 ms |
4684 KB |
Output is correct |
3 |
Execution timed out |
1682 ms |
8684 KB |
Time limit exceeded |
4 |
Halted |
0 ms |
0 KB |
- |