#include <bits/stdc++.h>
//#pragma GCC optimize("unroll-loops")
//#pragma GCC optimize("-O3")
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("fast-math")
//#pragma GCC optimize("no-stack-protector")
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/rope>
#define sz(x) int(x.size())
#define all(x) x.begin(),x.end()
#define PB push_back
#define MP make_pair
#define pii pair<int, int>
#define pll pair<ll, ll>
#define pil pair<int, ll>
#define pli pair<ll, int>
#define pdd pair<ld, ld>
#define ft first
#define sd second
using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;
typedef long long ll;
typedef long double ld;
template<class T>
using ordered_set = tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;
const int N = 1000100;
const int M = 100100;
const int BIG = int(5e6);
const int oo = 2e9;
const ll OO = 1e18;
const int md = 998244353;
const int PW = 30;
ll sum;
int a[N], ans = 0, n, mask, mn, mx, l1, r1, l2, r2;
int vc[2][N], k1, k0, MASK;
int main() {
#ifdef _LOCAL
freopen("in.txt","r",stdin); //freopen("output.txt","w",stdout);
#else
// freopen("mining.in","r",stdin); freopen("mining.out","w",stdout);
ios_base::sync_with_stdio(0); cin.tie(0);
#endif
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
vc[1][i] = a[i];
}
int ite = 1;
for (int bt = 0; bt < PW; bt++){
ite ^= 1;
mask = (1 << bt);
MASK = (1 << (bt + 1)) - 1;
k1 = k0 = 0;
for (int i = 0; i < n; i++)
if (!(a[i] & mask))
k1++;
for (int i = 0; i < n; i++)
if (vc[ite ^ 1][i] & mask)
vc[ite][k1++] = vc[ite ^ 1][i];
else vc[ite][k0++] = vc[ite ^ 1][i];
sum = 0;
l1 = n, r1 = n - 1, l2 = n, r2 = n - 1;
for (int i = 0; i < n; i++){
int cr = (vc[ite][i] & MASK);
mn = (1 << bt) - cr;
mx = (1 << (bt + 1)) - 1 - cr;
while (l1 > 0 && (vc[ite][l1 - 1] & MASK) >= mn)
l1--;
while (r1 >= 0 && (vc[ite][r1] & MASK) > mx)
r1--;
sum += r1 - l1 + 1;
if (cr >= mn && cr <= mx)
sum--;
mn += (1 << (bt + 1));
mx = (1 << (bt + 2)) - 1 - cr;
while (l2 > 0 && (vc[ite][l2 - 1] & MASK) >= mn)
l2--;
while (r2 >= 0 && (vc[ite][r2] & MASK) > mx)
r2--;
sum += r2 - l2 + 1;
if (cr >= mn && cr <= mx)
sum--;
}
sum /= 2;
if (sum & 1)
ans += (1 << bt);
}
for (int i = 0; i < n; i++)
ans ^= (a[i] + a[i]);
cout << ans;
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
8 ms |
384 KB |
Output is correct |
2 |
Correct |
8 ms |
384 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
401 ms |
13560 KB |
Output is correct |
2 |
Correct |
367 ms |
12152 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
401 ms |
13560 KB |
Output is correct |
2 |
Correct |
367 ms |
12152 KB |
Output is correct |
3 |
Correct |
534 ms |
13128 KB |
Output is correct |
4 |
Correct |
515 ms |
12536 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
8 ms |
384 KB |
Output is correct |
2 |
Correct |
8 ms |
384 KB |
Output is correct |
3 |
Correct |
94 ms |
2304 KB |
Output is correct |
4 |
Correct |
89 ms |
2304 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
8 ms |
384 KB |
Output is correct |
2 |
Correct |
8 ms |
384 KB |
Output is correct |
3 |
Correct |
401 ms |
13560 KB |
Output is correct |
4 |
Correct |
367 ms |
12152 KB |
Output is correct |
5 |
Correct |
534 ms |
13128 KB |
Output is correct |
6 |
Correct |
515 ms |
12536 KB |
Output is correct |
7 |
Correct |
94 ms |
2304 KB |
Output is correct |
8 |
Correct |
89 ms |
2304 KB |
Output is correct |
9 |
Correct |
773 ms |
12664 KB |
Output is correct |
10 |
Correct |
756 ms |
21624 KB |
Output is correct |
11 |
Correct |
781 ms |
21496 KB |
Output is correct |