题目描述
每个测试的时间限制:2 秒
内存限制:512 兆字节
给定两个长度为 n 的排列 p1,p2,…,pn 和 q1,q2,…,qn。
在一次操作中,你可以选择两个整数 1≤i,j≤n,i=j,并交换 pi 和 pj。
该操作的代价为 min(∣i−j∣,∣pi−pj∣)。
求使得对所有 1≤i≤n 都有 pi=qi 的最小总代价,并输出达到该最小代价的操作序列。
排列的定义:长度为 n 的排列是由 n 个从 1 到 n 的互不相同的整数组成的数组,顺序任意。
例如,[2,3,1,5,4] 是一个排列,但 [1,2,2] 不是(2 出现了两次),[1,3,4] 也不是(n=3 但数组中有 4)。
输入格式
第一行包含一个整数 t(1≤t≤104)——测试用例的数量。
每个测试用例的第一行包含一个整数 n(2≤n≤100)——排列 p 和 q 的长度。
第二行包含 n 个整数 p1,p2,…,pn(1≤pi≤n)——排列 p。保证 p1,p2,…,pn 是 1,2,…,n 的一个排列。
第三行包含 n 个整数 q1,q2,…,qn(1≤qi≤n)——排列 q。保证 q1,q2,…,qn 是 1,2,…,n 的一个排列。
保证所有测试用例的 n3 之和不超过 106。
输出格式
对于每个测试用例,第一行输出操作总数 k(0≤k≤n2)。
接下来 k 行,每行输出两个整数 i,j(1≤i,j≤n,i=j),表示依次交换 pi 和 pj 的操作。
可以证明,任何最优操作序列的长度不会超过 n2。
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
注意
在第二个测试用例中,你可以交换 p1 和 p3,代价为 min(∣1−3∣,∣1−3∣)=2。然后 p 等于 q,总代价为 2。
在第三个测试用例中,可以执行以下操作:
初始时,p=[2,1,4,3]。
- 交换 p1 和 p4,代价为 min(∣1−4∣,∣2−3∣)=1,得到 p=[3,1,4,2]。
- 交换 p2 和 p4,代价为 min(∣2−4∣,∣1−2∣)=1,得到 p=[3,2,4,1]。
- 交换 p1 和 p3,代价为 min(∣1−3∣,∣3−4∣)=1。此时 p 等于 q,总代价为 3。