답안 #918409

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
918409 2024-01-29T19:35:11 Z divad XOR Sum (info1cup17_xorsum) C++14
7 / 100
1600 ms 16612 KB
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
const int NMAX = 1e6+2;
int n,v[NMAX];

struct FenwickTree {
    int n;
    vector<int> aib;
    FenwickTree(int _n){
        n = _n;
        aib.resize(n+1);
    }
    void update(int pos, int val){
        for(int i = pos; i <= n; i += (i&-i)){
            aib[i] += val;
        }
    }
    int query(int pos){
        int ans = 0;
        for(int i = pos; i > 0; i -= (i&-i)){
            ans += aib[i];
        }
        return ans;
    }
    int query(int l, int r){
        return query(r) - query(l-1);
    }
};

int brut(int k){
    int ans = 0;
    int mod = (1<<(k+1));
    int l = (1<<k), r = (1<<(k+1))-1;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= i; j++){
            int sum = (v[i]+v[j])%mod;
            int bt = (sum>>k)&1;
            if(bt){
                assert(l <= sum && sum <= r);
            }
            ans += bt;
        }
    }
    return ans;
}

bool inauntru(int x, pii interv){
    auto [l, r] = interv;
    return (l <= x && x <= r);
}

int cnt(int k){
    int mod = (1<<(k+1));
    int ans = 0;
    map<int, int> nrm;
    for(int i = 1; i <= n; i++){
        int val = v[i]%mod;
        nrm[val+1] = i;
        int l = (1<<k), r = (1<<(k+1))-1;
        l = (l-val+mod)%mod;
        r = (r-val+mod)%mod;
        if(l <= r){
            nrm[r+1] = nrm[l] = i;
        }else{
            nrm[r+1] = nrm[l] = nrm[mod] = i;
        }
    }
    int cnt = 0;
    for(auto &it: nrm){
        it.second = ++cnt;
    }
    FenwickTree aib(cnt+1);
    for(int i = 1; i <= n; i++){
        int val = v[i]%mod;
        aib.update(nrm[val+1], 1);
        int l = (1<<k), r = (1<<(k+1))-1;
        l = (l-val+mod)%mod;
        r = (r-val+mod)%mod;
        if(l <= r){
            ans += aib.query(nrm[r+1]) - aib.query(nrm[l]);
        }else{
            ans += aib.query(nrm[r+1]);
            ans += aib.query(nrm[mod]) - aib.query(nrm[l]);
        }
    }
    return ans;
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> v[i];
    }
    int ans = 0;
    for(int i = 0; i < 30; i++){
        ans += (cnt(i)&1)*(1<<i);
    }
    cout << ans;
    return 0;
}

Compilation message

xorsum.cpp: In function 'bool inauntru(int, pii)':
xorsum.cpp:49:10: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   49 |     auto [l, r] = interv;
      |          ^
# 결과 실행 시간 메모리 Grader output
1 Correct 78 ms 856 KB Output is correct
2 Correct 73 ms 856 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1612 ms 4404 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1612 ms 4404 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 78 ms 856 KB Output is correct
2 Correct 73 ms 856 KB Output is correct
3 Execution timed out 1618 ms 16612 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 78 ms 856 KB Output is correct
2 Correct 73 ms 856 KB Output is correct
3 Execution timed out 1612 ms 4404 KB Time limit exceeded
4 Halted 0 ms 0 KB -