F. 天际线
时间限制:每个测试点 4 秒
内存限制:512 兆字节
题目描述
给定一个长度为 n 的排列 a。
我们说一个长度为 n 的排列 b 是好的,如果经过至多 n 次(可能为零次)下列操作后,a 和 b 可以变成相同:
选择两个整数 l,r,满足 1≤l<r≤n 且 ar=min(al,al+1,…,ar)。
将子段 [al,al+1,…,ar] 向右循环移位一位。
换句话说,将 a 替换为:
$$[a_1, \dots, a_{l-1}, a_r, a_l, a_{l+1}, \dots, a_{r-1}, a_{r+1}, \dots, a_n]
$$
同时,你还会得到一个长度为 n 的排列 c,其中某些元素缺失,用 0 表示。
你需要找到一个好的排列 b1,b2,…,bn,使得 b 可以通过填充 c 的缺失元素得到(即对每个 1≤i≤n,如果 ci=0,则 bi=ci)。如果不可能,输出 −1。
注:
- 长度为 n 的排列是由 1 到 n 的 n 个不同整数组成的数组,顺序任意。例如 [2,3,1,5,4] 是一个排列,但 [1,2,2] 不是(2 出现两次),[1,3,4] 也不是(n=3 但数组中有 4)。
输入格式
每个测试文件包含多个测试用例。
第一行包含一个整数 t(1≤t≤104),表示测试用例的数量。
每个测试用例:
- 第一行包含一个整数 n(2≤n≤5×105)。
- 第二行包含 n 个整数 a1,a2,…,an(1≤ai≤n),保证 a 是长度为 n 的排列。
- 第三行包含 n 个整数 c1,c2,…,cn(0≤ci≤n),保证 c 中不为 0 的元素互不相同。
所有测试用例的 n 之和不超过 5×105。
输出格式
对于每个测试用例:
- 如果不可能找到这样的好的排列 b,输出一行 −1。
- 否则,输出一行 n 个整数 b1,b2,…,bn,表示找到的好的排列 b。需要满足对每个 i,若 ci=0,则 bi=ci。如果有多个答案,输出任意一个。
示例
输入
9
2
2 1
1 2
4
3 2 4 1
2 0 0 1
5
3 2 1 5 4
1 3 0 0 0
5
3 2 1 5 4
3 2 1 5 4
5
3 2 1 5 4
3 2 5 1 4
6
3 5 6 2 1 4
0 2 0 5 0 0
6
3 5 6 2 1 4
0 2 0 6 4 0
9
6 9 2 4 1 7 8 3 5
0 2 5 9 0 0 0 8 0
9
8 5 3 9 1 7 4 6 2
0 0 8 0 7 0 4 0 2
输出
1 2
2 3 4 1
1 3 2 4 5
3 2 1 5 4
-1
3 2 1 5 4 6
-1
-1
1 3 8 5 7 9 4 6 2
样例解释
- 第一个测试用例:b=[1,2] 是有效答案,因为执行一次操作(l=1,r=2,向右循环移位一次)后 a 变成 [1,2],与 b 相同。
- 第二个测试用例:b=[2,3,4,1] 是有效答案,因为一次操作(l=1,r=2)后 a 变成 [2,3,4,1]。
- 第三个测试用例:b=[1,3,2,4,5] 是有效答案,需要两次操作:
- l=1,r=3,a 变为 [1,3,2,5,4]。
- l=4,r=5,a 变为 [1,3,2,4,5]。
- 第四个测试用例:a 与 b 已相同。
- 第五个测试用例:无法找到符合条件的 b,输出 −1。
- 第六个测试用例:b=[3,2,1,5,4,6] 是有效答案,需要三次操作:
- l=2,r=4:[3,2,5,6,1,4]
- l=3,r=5:[3,2,1,5,6,4]
- l=5,r=6:[3,2,1,5,4,6]