题解 CF1322B 【Present】

xht

2020-03-09 23:31:44

Solution

按位考虑。 对于第 $k$ 位,我们只关心每个数对 $2^{k+1}$ 取模后的值。 对于两个取模后的数,如果要在第 $k$ 位为 $1$,和必须在 $[2^k, 2^{k+1}-1]$ 或 $[2^k + 2^{k+1}, 2^{k+2}-2]$ 中。 排序之后双指针扫一遍即可,时间复杂度 $\mathcal O(n \log n \log w)$。 ```cpp const int N = 4e5 + 7; int n, a[N], b[N], ans; inline bool calc(int L, int R) { if (L > R) return 0; ll ret = 0; for (int i = n, l = 1, r = 1; i; i--) { while (l <= n && b[i] + b[l] < L) ++l; while (r <= n && b[i] + b[r] <= R) ++r; ret += r - l - (l <= i && i < r); } return (ret >> 1) & 1; } inline bool solve(int k) { for (int i = 1; i <= n; i++) b[i] = a[i] & ((1 << (k + 1)) - 1); sort(b + 1, b + n + 1); return calc(1 << k, (1 << (k + 1)) - 1) ^ calc(3 << k, (1 << (k + 2)) - 2); } int main() { rd(n), rda(a, n); for (int i = 0; i < 26; i++) ans |= solve(i) << i; print(ans); return 0; } ```