Submission #1158244

#TimeUsernameProblemLanguageResultExecution timeMemory
1158244itaykarnyXOR Sum (info1cup17_xorsum)C++20
56 / 100
1693 ms25980 KiB
#include<iostream> #include<vector> #include<algorithm> #include<set> #include<map> #include<queue> #include<string> #include<math.h> using namespace std; using ll = long long; using vll = vector<ll>; using vvll = vector<vll>; using pll = pair<ll, ll>; using vpll = vector<pair<ll, ll>>; using vvpll = vector<vpll>; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); ll n; cin >> n; ll arr[ll(1e6) + 1]; for (ll i = 0; i < n; i++) cin >> arr[i]; ll ans = 0; for (ll b = 0; b < 29; b++) { // Look at the first b bits vll cur0; // Keep all the numbers that have 0 in the b bit with only their first b-1 bits vll cur1; // Keep all the numbers that have 1 in the b bit with only their first b-1 bits ll A = (1LL << (b)) - 1; for (ll i = 0; i < n; i++) { if ((arr[i] >> b) & (ll)1) cur1.push_back(arr[i] & A); else cur0.push_back(arr[i] & A); } sort(cur0.begin(), cur0.end()); sort(cur1.begin(), cur1.end()); long long res = 0; ll carry = (ll)1 << b; ll pos = 0; ll t = 0; ll pos1 = cur0.size() - 1; for (ll j = cur0.size() - 1; j >= 0; j--) { for (; pos < cur1.size(); pos++) { if (cur0[j] + cur1[pos] >= carry) { break; } } res += pos; for (; pos1 >= 0; pos1--) { if (cur0[cur0.size() - 1 - j] + cur0[pos1] < carry) { break; } } t += cur0.size() - pos1 - 1; } pos = cur1.size() - 1; for (ll j = 0; j < cur1.size(); j++) { for (; pos >= 0; pos--) { if (cur1[j] + cur1[pos] < carry) { break; } } t += cur1.size() - pos - 1; } for (ll i = 0; i < n; i++) { if (((2 * arr[i]) >> b) & 1) { t++; } } res += t / 2; ans += (res % 2) * carry; } cout << ans << endl; }
#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...