제출 #362256

#제출 시각아이디문제언어결과실행 시간메모리
362256SeDunionXOR Sum (info1cup17_xorsum)C++17
100 / 100
1299 ms21612 KiB
#include<bits/stdc++.h> using namespace std; using ll = long long; const int N = 1e6 + 66; // // bit // 2^bit // a[i] %= 2^(bit+1) // 1 <= a[i] <= 2^(bit+1)-1 // 2 <= a[i] + a[j] <= 2^(bit+2)-2 // 0010000000 // 0011111111 // 0110000000 // 0111111111 // // 2^bit <= a[i] + a[j] <= 2^(bit+1)-1 // 2^(bit+1)+2^(bit) <= a[i] + a[j] <= 2^(bit+2)-1 const int LOG = 30; int a[N], b[N], c[N]; int main() { ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0); int n; cin >> n; for (int i = 1 ; i <= n ; ++ i) cin >> a[i], b[i] = a[i] % (1ll<<LOG); int ans = 0; for (int bit = LOG-1 ; bit >= 0 ; -- bit) { //cout << (1<<bit) << ": "; if (b[n] >= (1ll << (bit + 1))) { int j = n; while (j > 1 && b[j - 1] >= (1ll << (bit + 1))) --j; for (int i = j ; i <= n ; ++ i) b[i] ^= (1ll << (bit + 1)); merge(b+1,b+j, b+j, b+n+1, c+1); //cout << j << "| "; for (int i = 1 ; i <= n ; ++ i) { b[i] = c[i]; } } int parity = 0; sort(b+1,b+1+n); //for (int i = 1 ; i <= n ; ++ i) cout << b[i] << " \n"[i == n]; for (int i = 1, l = n, r = n ; i <= n ; ++ i) { while (l >= 1 && (1<<bit) <= b[i] + b[l]) --l; while (r >= 1 && b[i] + b[r] > (1<<(bit+1))-1) --r; int cur = max(r,i) - max(l,i-1); if (r < i) break; if (cur & 1) parity ^= 1; //cout << i << " " << l + 1 << " " << r << "\n"; } for (int i = 1, l = n, r = n ; i <= n ; ++ i) { while (l >= 1 && (1<<(bit+1))+(1<<bit) <= b[i] + b[l]) --l; while (r >= 1 && b[i] + b[r] > (1ll<<(bit+2))-1) --r; int cur = max(r,i) - max(l,i-1); if (r < i) break; if (cur & 1) parity ^= 1; //cout << i << " " << l + 1 << " " << r << "\n"; } ans += parity * (1 << bit); } cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...