#CF2062G. 置换工厂

置换工厂

题目描述

每个测试的时间限制:2 秒
内存限制:512 兆字节

给定两个长度为 nn 的排列 p1,p2,,pnp_1, p_2, \dots, p_nq1,q2,,qnq_1, q_2, \dots, q_n
在一次操作中,你可以选择两个整数 1i,jn1 \le i, j \le niji \ne j,并交换 pip_ipjp_j
该操作的代价为 min(ij,pipj)\min(|i-j|, |p_i - p_j|)

求使得对所有 1in1 \le i \le n 都有 pi=qip_i = q_i 的最小总代价,并输出达到该最小代价的操作序列。

排列的定义:长度为 nn 的排列是由 nn 个从 11nn 的互不相同的整数组成的数组,顺序任意。
例如,[2,3,1,5,4][2,3,1,5,4] 是一个排列,但 [1,2,2][1,2,2] 不是(22 出现了两次),[1,3,4][1,3,4] 也不是(n=3n=3 但数组中有 44)。

输入格式

第一行包含一个整数 tt1t1041 \le t \le 10^4)——测试用例的数量。
每个测试用例的第一行包含一个整数 nn2n1002 \le n \le 100)——排列 ppqq 的长度。
第二行包含 nn 个整数 p1,p2,,pnp_1, p_2, \dots, p_n1pin1 \le p_i \le n)——排列 pp。保证 p1,p2,,pnp_1, p_2, \dots, p_n1,2,,n1,2,\dots,n 的一个排列。
第三行包含 nn 个整数 q1,q2,,qnq_1, q_2, \dots, q_n1qin1 \le q_i \le n)——排列 qq。保证 q1,q2,,qnq_1, q_2, \dots, q_n1,2,,n1,2,\dots,n 的一个排列。
保证所有测试用例的 n3n^3 之和不超过 10610^6

输出格式

对于每个测试用例,第一行输出操作总数 kk0kn20 \le k \le n^2)。
接下来 kk 行,每行输出两个整数 i,ji, j1i,jn1 \le i, j \le niji \ne j),表示依次交换 pip_ipjp_j 的操作。
可以证明,任何最优操作序列的长度不会超过 n2n^2

4
2
2 1
2 1
3
1 2 3
3 2 1
4
2 1 4 3
4 2 3 1
5
1 4 3 2 5
5 2 3 4 1
0
1
1 3
3
1 4
2 4
1 3
4
1 2
4 5
2 5
1 4

注意
在第二个测试用例中,你可以交换 p1p_1p3p_3,代价为 min(13,13)=2\min(|1-3|, |1-3|)=2。然后 pp 等于 qq,总代价为 22

在第三个测试用例中,可以执行以下操作:
初始时,p=[2,1,4,3]p=[2,1,4,3]

  • 交换 p1p_1p4p_4,代价为 min(14,23)=1\min(|1-4|, |2-3|)=1,得到 p=[3,1,4,2]p=[3,1,4,2]
  • 交换 p2p_2p4p_4,代价为 min(24,12)=1\min(|2-4|, |1-2|)=1,得到 p=[3,2,4,1]p=[3,2,4,1]
  • 交换 p1p_1p3p_3,代价为 min(13,34)=1\min(|1-3|, |3-4|)=1。此时 pp 等于 qq,总代价为 33