#CF2124I. 字典序划分

字典序划分

I. 字典序划分
时间限制:2 秒
内存限制:256 兆字节

给定一个数组 aa,定义 f(a)f(a) 如下:

  • 选择一个整数 kk1kn1 \le k \le n)。
  • aa 划分成 kk 个子数组 s1,s2,,sks_1, s_2, \dots, s_k,使得 s1+s2++sk=as_1 + s_2 + \dots + s_k = a(这里 ++ 表示数组拼接)。
  • bb 为一个空数组。对于 i=1i = 1kk 按顺序,将 sis_i 的最小值追加到 bb 的末尾。
  • 对于所有可能的 kk 和划分,f(a)f(a) 是使得存在一种划分产生字典序最大bbkk 值。

给定 nn 个整数 x1,x2,,xnx_1, x_2, \dots, x_n。请判断是否存在一个排列 aa,使得对每个 1in1 \le i \le n,有 f([a1,a2,,ai])=xif([a_1, a_2, \dots, a_i]) = x_i。如果存在,输出一个这样的排列。如果存在多个答案,输出任意一个。


输入
每个测试包含多个测试用例。第一行包含测试用例数 tt1t1041 \le t \le 10^4)。

每个测试用例的第一行包含一个整数 nn2n21052 \le n \le 2 \cdot 10^5)—— 数组 xx 的长度。

第二行包含 nn 个整数 x1,x2,,xnx_1, x_2, \dots, x_n1xii1 \le x_i \le i)—— 数组 xx

保证所有测试用例的 nn 之和不超过 21052 \cdot 10^5


输出
对于每个测试用例,如果存在满足条件的排列,则输出 "YES",否则输出 "NO"。每个字母可以大写或小写。

如果答案为肯定,则在下一行输出 nn 个整数的排列。


样例
输入

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,2,3] 是满足输入数组的一个有效排列:

    • 对于 [1][1],只有一种划分方式,因此 f([1])=1f([1]) = 1
    • 对于 [1,2][1,2],有两种划分方式:[1,2][1,2] 自身或 [1]+[2][1] + [2]。对应的 bb 分别为 [1][1][1,2][1,2],后者字典序更大,因此 f([1,2])=2f([1,2]) = 2
    • 对于 [1,2,3][1,2,3],可以证明最优划分是 [1,2]+[3][1,2] + [3],得到 b=[1,3]b = [1,3]
  • 第二个测试用例中,可以证明不存在长度为 22 且满足 x1=x2=1x_1 = x_2 = 1 的排列。

  • 第四个测试用例中,一个满足条件的排列是 [3,1,2][3,1,2]