Submission #1314156

#TimeUsernameProblemLanguageResultExecution timeMemory
1314156andrei_nXOR Sum (info1cup17_xorsum)C++20
100 / 100
496 ms6288 KiB
#include <bits/stdc++.h>

using namespace std;

int n;
int v[1000005];

int main() {
    ios::sync_with_stdio(false); cin.tie(0);
    cin>>n;
    for(int i=1; i<=n; ++i) {
        cin>>v[i];
    }
    int maxi = *max_element(v+1, v+n+1);
    sort(v+1, v+n+1);
    int ans = 0;
    for(int bit = 32 - __builtin_clz(maxi); bit >= 0; --bit) {
        int first = n+1;
        for(int i=1; i<=n; ++i) {
            if(v[i] & (1<<bit+1)) {
                v[i] -= (1<<bit+1);
                first = min(first, i);
            }
        }
        inplace_merge(v+1, v+first, v+n+1);
        int cnt = 0;
        int p1 = n+1, p2 = n+1, p3 = n+1;
        for(int i=1; i<=n; ++i) {
            //v[j] + v[i] >= (1<<bit) && v[j] + v[i] < (1<<bit+1) ||
            //v[j] + v[i] >= (1<<bit) + (1<<bit+1)
            while(v[p1-1] >= (1<<bit) - v[i] && p1 > 1) --p1;
            while(v[p2-1] >= (1<<bit+1) - v[i] && p2 > 1) --p2;
            while(v[p3-1] >= (1<<bit) + (1<<bit+1) - v[i] && p3 > 1) --p3;
            cnt += min(p2, i+1) - min(p1, i+1) + i - min(p3, i+1) + 1;
        }
        if(cnt & 1) {
            ans |= (1<<bit);
        }
    }
    cout<<ans;
    return 0;
}
#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...