AtCoder Regular Contest 092 B Two Sequences
题目大意
给定两个长为 \(n\) 个整数序列 \(a_1, \dots, a_n\) 和 \(b_1, \dots, b_n\) 。求所有 \(a_i + b_j\)(\(1\le i, j\le n\))的 XOR 值。
数据范围
\(1\le n \le 200000\)
\(0\le a_i, b_j < 2^{28}\)
解法
这道题比赛时没想出来,赛后想到解法了。
我们的目标是求出这 \(n^2\) 个数中有奇数个还是偶数个数的二进制第 \(k\) 位为 \(1\),而不必求出其中究竟有几个数的二进制第 \(k\) 位为 \(1\) 。
若不考虑进位,则很容易求出这 \(n^2\) 个数中有几个数二进制第 \(k\) 位为 \(1\)。考虑进位时,我们也只需要知道(两数相加)向第 \(k\) 位进位发生了多少次。
向第 \(k\) 位进位发生了多少次这个问题可以这样求解:
将 \(a_1, \dots, a_n\) 的前 \(k\) 位 (第 \(0\) 到第 \(k-1\) 位)构成的数排序。枚举 \(b_i\),二分搜索出前述序列中有多少个数与 \(b_i\) 的前 \(k\) 位之和大于等于 \(2^{k}\) 。
UPD1
我描述的解法思路不够清晰简明,题解上给出的解法更好。
总而言之,这篇题解的参考价值不大(几乎没有参考价值),败笔。