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...