Submission #1184052

#TimeUsernameProblemLanguageResultExecution timeMemory
1184052petezaXOR Sum (info1cup17_xorsum)C++20
100 / 100
934 ms67732 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; ll n, arr[1000005], newarr[1000005]; ll res = 0; vector<pair<ll, int>> cvec; void updbuc(int k) { //update 2^k into cvec //currently cvec is sorted according to 2^0, 2^1, ..., 2^n vector<pair<ll, int>> vec1, vec2; for(auto &e:cvec) { if(arr[e.second] & (1ll << k)) vec2.emplace_back(e); else vec1.emplace_back(e); } cvec = vec1; for(auto &e:vec2) { e.first ^= (1 << k); cvec.emplace_back(e); } } int main() { cin.tie(0) -> sync_with_stdio(0); cin >> n; for(int i=0;i<n;i++) { cin >> arr[i]; newarr[i] = arr[i]; cvec.emplace_back(0, i); } for(int k=0;k<32;k++) { int cres = 0; int odc = 0, evc = 0; for(int i=0;i<n;i++) { if(newarr[i] & 1) odc++; else evc++; } cres = (odc & 1) * (evc & 1); if(k) { long long cnt = 0; updbuc(k-1); for(int i=0;i<n;i++) { if(((arr[i] & ((1ll << k) - 1)) << 1) >= (1ll << k)) cnt++; } int clow = n; for(int i=0;i<n;i++) { while(clow) { if(cvec[clow-1].first >= ((1ll << k) - cvec[i].first)) clow--; else break; } cnt += (n-clow); } //cout << cnt << '\n'; cnt = ((cnt >> 1) & 1); cres ^= cnt; } if(cres) res ^= (1ll << k); for(int i=0;i<n;i++) newarr[i] >>= 1; } cout << res; }
#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...