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
我描述的解法思路不够清晰简明,题解上给出的解法更好。
总而言之,这篇题解的参考价值不大(几乎没有参考价值),败笔。

posted @ 2018-03-18 14:38  Pat  阅读(194)  评论(0编辑  收藏  举报