P1366 有序表的合并
题目描述
给出两个数列 $a, b$,均按不降序排序。其中保证 $a$ 中没有重复的数字。
现在请你求出:$a$ 中每一个数字在 $b$ 中出现了几次?
输入格式
无
输出格式
无
说明/提示
### 样例 1 解释
- $a_1 = 1$ 在 $b$ 中出现了 $1$ 次。
- $a_2 = 3$ 在 $b$ 中出现了 $2$ 次。
- $a_3 = 6$ 在 $b$ 中出现了 $0$ 次。
故输出为 $1 \bigoplus 2 = 3$。
### 样例 2 解释
$1, 4, 5$ 分别在 $b$ 中出现了 $2, 1, 1$ 次,故输出为 $2 \bigoplus 1 \bigoplus 1 = 2$。
### 数据规模与约定
对于全部的测试点,保证:
- $1 \leq T \leq 10$;
- $1 \leq n, m \leq 10^7$,$\sum (n + m) \leq 10^7$;
- $1 \leq a_i, b_i < 2^{64}$,且 $a_i < a_{i + 1}$,$b_i \leq b_{i + 1}$。
其中 $\sum (n+m)$ 表示单测试点内所有 $n$ 与 $m$ 的和,即输入数列的总长度不超过 $10^7$。
### 提示
- 请注意大量数据读入对程序效率造成的影响,选择合适的读入方式,避免超时。
- 请采用合适的数据类型存储变量,避免溢出。
- 如果你不知道什么是按位异或和,可以在你的代码里添加如下的函数:
```cpp
template
T getXorSum(T *begin, T *end) {
T ret = 0;
for (T *it = begin; it != end; ++it) ret ^= *it;
return ret;
}
```
这一函数的作用是计算传入数组(包括 `std::vector`)某一左闭右开区间的按位异或和,返回值类型与传入数组的类型相同,调用方法与 `std::sort` 类似,例如,要求数组 $a$ 的 $a_1 \sim a_n$ 的按位异或和,则调用 `getXorSum(a + 1, a + 1 + n)`,求 $a_0 \sim a_{n - 1}$ 的按位异或和,则调用 `getXorSum(a, a + n)`。如果 $a$ 是 `std::vector`,则将上述调用代码里的 `a` 均改为 `a.begin()` 即可。