F. 两个数组
每个测试点时间限制:2 秒
内存限制:512 兆字节
给定两个长度为 n 的数组 a 和 b。你可以进行任意次以下操作:
- 选择一个下标 i(1≤i≤n),交换 ai 和 bi。
记 f(c) 为数组 c 中不同数字的个数。
目标是最大化 f(a)+f(b)。同时,输出操作完成后的数组 a 和 b。
输入格式
每个测试点包含多个测试用例。第一行包含一个整数 t(1≤t≤104),表示测试用例的数量。
接下来每个测试用例的描述如下:
- 第一行包含一个整数 n(1≤n≤105),表示数组的长度。
- 第二行包含 n 个整数 a1,a2,…,an(1≤ai≤2n)。
- 第三行包含 n 个整数 b1,b2,…,bn(1≤bi≤2n)。
数据保证所有测试用例的 n 之和不超过 105。
输出格式
对于每个测试用例,在第一行输出一个整数 — 最大的 f(a)+f(b)。
在第二行输出 n 个整数 — 操作后的数组 a。
在第三行输出 n 个整数 — 操作后的数组 b。
示例
输入
3
5
1 2 4 4 4
1 3 3 5 2
7
2 2 4 4 5 5 5
1 3 3 2 1 6 6
7
12 3 3 4 5 6 4
1 2 13 8 10 13 7
输出
9
1 3 4 5 2
1 2 3 4 4
12
2 3 4 2 1 5 6
1 2 3 4 5 6 5
14
12 3 13 8 10 6 4
1 2 3 4 5 13 7
示例解释
第一个测试用例:
进行三次操作,分别交换 i=2、i=4 和 i=5 位置上的元素,得到:
a=[1,3,4,5,2],b=[1,2,3,4,4]。
此时 f(a)=5,f(b)=4,总和为 9,可证明无法更大。
第二个测试用例:
操作后:
a=[2,3,4,2,1,5,6],b=[1,2,3,4,5,6,5]。
f(a)=6,f(b)=6,总和为 12。