Difficulty:3.9 / Easy
Tag:-
5min 秒的。
首先回顾经典问题,如果只有一个出现恰好一次可以怎么做?
注意到异或可以完美解决这个问题。因为在任何时候,异或两次相同的数答案都会不变。所以最后的结果就是只出现一次的数。
现在考虑这个问题。显然把所有异或的结果是 x⊕yx\oplus yx⊕y,怎么通过这个求出 xxx 和 yyy 呢?
考虑第 3∼53\sim 53∼5 个点这个部分分。
我们发现,如果把奇数分为一组,偶数分为一组,那么两组就分别有 xxx 或 yyy 出现一次,其它的数也在这两组之一出现两次。此时将两组分别取异或,得到的结果就分别是 x,yx,yx,y。
然后注意到若 x,yx,yx,y 某一位不同,将这一位当成个位,就可以按照 3∼53\sim 53∼5 点的解法解决。而这些位一定满足 x⊕yx\oplus yx⊕y 的该位为 111。
所以我们再分别存储所有第 iii 位为 111 的数的异或和,再找到 x⊕yx\oplus yx⊕y 其中为 111 的位,就能求出 xxx 与 yyy 的值了。
实现时尽量避开 iostream 等空间消耗大的头文件,节省空间;2×1062\times 10^62×106 个整数输入量还是很大的,建议使用快读快写。其实是我忘了 scanf 和 printf 这俩玩意了
时间复杂度:O(∑nlogV)O(\sum n\log V)O(∑nlogV)。
空间复杂度:O(logV)O(\log V)O(logV)。
最大空间 1.39MB。