I. 字典序划分
时间限制:2 秒
内存限制:256 兆字节
给定一个数组 a,定义 f(a) 如下:
- 选择一个整数 k(1≤k≤n)。
- 将 a 划分成 k 个子数组 s1,s2,…,sk,使得 s1+s2+⋯+sk=a(这里 + 表示数组拼接)。
- 令 b 为一个空数组。对于 i=1 到 k 按顺序,将 si 的最小值追加到 b 的末尾。
- 对于所有可能的 k 和划分,f(a) 是使得存在一种划分产生字典序最大的 b 的 k 值。
给定 n 个整数 x1,x2,…,xn。请判断是否存在一个排列 a,使得对每个 1≤i≤n,有 f([a1,a2,…,ai])=xi。如果存在,输出一个这样的排列。如果存在多个答案,输出任意一个。
输入
每个测试包含多个测试用例。第一行包含测试用例数 t(1≤t≤104)。
每个测试用例的第一行包含一个整数 n(2≤n≤2⋅105)—— 数组 x 的长度。
第二行包含 n 个整数 x1,x2,…,xn(1≤xi≤i)—— 数组 x。
保证所有测试用例的 n 之和不超过 2⋅105。
输出
对于每个测试用例,如果存在满足条件的排列,则输出 "YES",否则输出 "NO"。每个字母可以大写或小写。
如果答案为肯定,则在下一行输出 n 个整数的排列。
样例
输入
8
3
1 2 2
2
1 1
3
1 2 1
3
1 2 3
4
1 2 2 4
4
1 2 3 3
5
1 2 3 2 3
9
1 2 3 4 5 4 5 6 6
输出
YES
1 2 3
NO
NO
YES
3 1 2
NO
YES
3 1 2 4
YES
1 4 3 5 2
YES
5 2 1 8 6 9 3 4 7
说明
-
第一个测试用例中,[1,2,3] 是满足输入数组的一个有效排列:
- 对于 [1],只有一种划分方式,因此 f([1])=1。
- 对于 [1,2],有两种划分方式:[1,2] 自身或 [1]+[2]。对应的 b 分别为 [1] 和 [1,2],后者字典序更大,因此 f([1,2])=2。
- 对于 [1,2,3],可以证明最优划分是 [1,2]+[3],得到 b=[1,3]。
-
第二个测试用例中,可以证明不存在长度为 2 且满足 x1=x2=1 的排列。
-
第四个测试用例中,一个满足条件的排列是 [3,1,2]。