Submission #389459

# Submission time Handle Problem Language Result Execution time Memory
389459 2021-04-14T06:20:50 Z 2qbingxuan XOR Sum (info1cup17_xorsum) C++14
100 / 100
492 ms 11080 KB
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#ifdef local
#define safe cerr<<__PRETTY_FUNCTION__<<" line "<<__LINE__<<" safe\n"
#define pary(a...) danb(#a, a)
#define debug(a...) qqbx(#a, a)
template <typename ...T> void qqbx(const char *s, T ...a) {
    int cnt = sizeof...(T);
    ((std::cerr << "\033[1;32m(" << s << ") = (") , ... , (std::cerr << a << (--cnt ? ", " : ")\033[0m\n")));
}
template <typename T> void danb(const char *s, T L, T R) {
    std::cerr << "\033[1;32m[ " << s << " ] = [ ";
    for (int f = 0; L != R; ++L)
        std::cerr << (f++ ? ", " : "") << *L;
    std::cerr << " ]\033[0m\n";
}
#else
#define debug(...) ((void)0)
#define safe ((void)0)
#define pary(...) ((void)0)
#endif // local
#define all(v) begin(v),end(v)
#define pb emplace_back
using namespace std;
using ll = int64_t;
const int maxn = 1000025, LGC = 30;

struct TREE : vector<int> {
    int less_equal(int x) {
        return upper_bound(all(), x) - begin();
    }
    int greater(int x) {
        return end() - upper_bound(all(), x);
    }
    int calc(int U) {
        if (empty()) return 0;
        // return #(a[i] > b[j]) where b[i] = U - a[i]
        int ans = 0;
        for (int i = size()-1, j = 0; i >= 0; i--) {
            while (j < size() && ((*this)[i] & U) + ((*this)[j] & U) <= U) ++j;
            if (j > i)
                break;
            ans += i - j + 1 & 1;
        }
        return ans & 1;
    }
} pre[2];
int calc(TREE &a, TREE &b, int U) {
    if (a.empty() || b.empty()) return 0;
    int ans = 0;
    for (int i = a.size()-1, j = 0; i >= 0; i--) {
        while (j < b.size() && (a[i] & U) + (b[j] & U) <= U) ++j;
        ans += j & 1;
    }
    return ans & 1;
}
int a[maxn];
signed main() {
    ios_base::sync_with_stdio(0), cin.tie(0);
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> a[i];

    pre[0].reserve(n);
    pre[1].reserve(n);
    int ans = 0;
    for (int b = 0; b < LGC; b++) {
        int U = (1<<b) - 1;
        int parity = 0;
        pre[0].clear();
        pre[1].clear();
        // sort(a, a+n, [U](int x, int y){ return (x & U) < (y & U); });
        /*
        for (int i = 0; i < n; i++) {
            int d = a[i] >> b & 1;
            pre[d].push_back(a[i] & U);
            parity += pre[!d].less_equal(~a[i] & U);
            parity += pre[d].greater(~a[i] & U);
        }
        */
        for (int i = 0; i < n; i++)
            pre[a[i] >> b & 1].pb(a[i]);
        parity += pre[0].calc(U);
        parity += pre[1].calc(U);
        parity += calc(pre[0], pre[1], U);
        debug(parity);
        parity &= 1;
        ans |= parity << b;

        int i = 0;
        for (int x: pre[0])
            a[i++] = x;
        for (int x: pre[1])
            a[i++] = x;
    }
    cout << ans << '\n';
}

Compilation message

xorsum.cpp: In member function 'int TREE::calc(int)':
xorsum.cpp:40:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   40 |             while (j < size() && ((*this)[i] & U) + ((*this)[j] & U) <= U) ++j;
      |                    ~~^~~~~~~~
xorsum.cpp:43:26: warning: suggest parentheses around '+' in operand of '&' [-Wparentheses]
   43 |             ans += i - j + 1 & 1;
      |                    ~~~~~~^~~
xorsum.cpp: In function 'int calc(TREE&, TREE&, int)':
xorsum.cpp:52:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   52 |         while (j < b.size() && (a[i] & U) + (b[j] & U) <= U) ++j;
      |                ~~^~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 3 ms 332 KB Output is correct
2 Correct 3 ms 332 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 313 ms 10984 KB Output is correct
2 Correct 299 ms 10348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 313 ms 10984 KB Output is correct
2 Correct 299 ms 10348 KB Output is correct
3 Correct 366 ms 11080 KB Output is correct
4 Correct 357 ms 10612 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 332 KB Output is correct
2 Correct 3 ms 332 KB Output is correct
3 Correct 53 ms 1400 KB Output is correct
4 Correct 52 ms 1392 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 332 KB Output is correct
2 Correct 3 ms 332 KB Output is correct
3 Correct 313 ms 10984 KB Output is correct
4 Correct 299 ms 10348 KB Output is correct
5 Correct 366 ms 11080 KB Output is correct
6 Correct 357 ms 10612 KB Output is correct
7 Correct 53 ms 1400 KB Output is correct
8 Correct 52 ms 1392 KB Output is correct
9 Correct 492 ms 11048 KB Output is correct
10 Correct 484 ms 10996 KB Output is correct
11 Correct 480 ms 11024 KB Output is correct