Submission #389295

#TimeUsernameProblemLanguageResultExecution timeMemory
3892952qbingxuanXOR Sum (info1cup17_xorsum)C++14
77 / 100
1700 ms11024 KiB
#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 = 29; 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] + (*this)[j] <= 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] + b[j] <= 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] & U); parity += pre[0].calc(U); parity += pre[1].calc(U); parity += calc(pre[0], pre[1], U); debug(parity); parity &= 1; ans |= parity << b; } cout << ans << '\n'; }

Compilation message (stderr)

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] + (*this)[j] <= 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] + b[j] <= U) ++j;
      |                ~~^~~~~~~~~~
#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...