Submission #1141432

#TimeUsernameProblemLanguageResultExecution timeMemory
1141432MrAndriaXOR Sum (info1cup17_xorsum)C++20
100 / 100
267 ms8260 KiB
#include <iostream> #include <algorithm> #include <map> using namespace std; #define FOR(i,a,b) for(int i = a; i < b; i++) typedef long long ll; int ans; void flatten (int a[], int alen, int nbits) { int mask = (1 << nbits) - 1; FOR(i, 0, alen) { a[i] = a[i] & mask; } } ll num_sums_gt(int a[], int alen, int b[], int blen, int k) { ll tot = 0; int ia = alen; for (int ib = 0; ib < blen; ib++) { while (ia > 0 && a[ia-1] + b[ib] > k) { ia--; } tot += (alen-ia); } return tot; } // std::merge already exists, but it's not in-place void mymerge (int a[], int alen, int lhs_len) { int lhs[lhs_len]; int *rhs = a + lhs_len; int lhs_start = 0; int rhs_start = 0; int rhs_len = alen - lhs_len; for (int i = 0; i < lhs_len; i++) { lhs[i] = a[i]; } for (int i = 0; i < alen; i++) { if (rhs_start == rhs_len || (lhs_start < lhs_len && lhs[lhs_start] < rhs[rhs_start])) { a[i] = lhs[lhs_start]; lhs_start++; } else { a[i] = rhs[rhs_start]; rhs_start++; } } } int self_psum_xor (int a[], int alen, int nbits) { int total = 0; while (nbits > 0) { int biggest_small = (1 << (nbits-1)) - 1; int* mid_ptr = upper_bound(a, a+alen, biggest_small); int num_smalls = mid_ptr - a; int num_bigs = alen - num_smalls; flatten(a + num_smalls, num_bigs, nbits-1); ll ngt = num_sums_gt(a, num_smalls, a+num_smalls, num_bigs, biggest_small); total = total ^ (((num_bigs % 4)/2) << nbits); total = total ^ (((num_bigs % 2) * (num_smalls % 2)) << (nbits-1)); total = total ^ ((ngt % 2) << (nbits)); mymerge(a, alen, num_smalls); nbits--; } return total; } void run() { int n; cin >> n; int a[n]; FOR(i,0,n) {cin >> a[i];} for(int i=0;i<n;i++){ ans^=(2*a[i]); } sort(a, a+n); ans^=self_psum_xor(a,n,30); cout<<ans<<endl; } int main () { ios_base::sync_with_stdio(false); cin.tie(NULL); run(); }
#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...