在练习了数绘(Fillomino)技巧后,小蓝鱼(Little Cyan Fish)决定在游戏“The Artisan of Glimmith”中进行更多训练。
小蓝鱼首先向你介绍了数绘的规则:
对于一个 $m$ 行 $n$ 列的网格,将其划分为若干个区域(每个区域的单元格必须正交相连),使得任意两个相邻区域的面积不同。 网格中的某些单元格已经填有数字。该数字表示它所属区域的面积。
数绘谜题的一个例子。来源:Puzzle GP 2022 R4
现在小蓝鱼给你一个数绘棋盘,他想让你为这个数绘谜题构造任意一个合法解。
当然,这个问题对小蓝鱼来说太难了,所以你只需要解决 $m = 1$ 的情况。换句话说,给定一行 $n$ 个单元格,你想将这些单元格划分为若干个线段(每个线段完全包含若干个连续的单元格),要求:
- 任意两个相邻线段的长度不同;
- 某些单元格包含一些数字,这些数字表示该单元格所属线段的单元格数量(即线段长度)。
小蓝鱼请你判断该棋盘是否存在合法解。如果存在,你还需要输出任意一个合法解。
输入格式
有多个测试用例。输入的第一行包含一个整数 $T$ ($1 \le T$),表示测试用例的数量。
对于每个测试用例,输入的第一行包含一个整数 $n$ ($1 \le n \le 10^6$)。
下一行包含 $n$ 个整数 $a_1, a_2, \dots, a_n$ ($0 \le a_i \le n$)。如果 $a_i = 0$,表示第 $i$ 个单元格中没有填入数字。否则,表示第 $i$ 个单元格中填入了数字 $a_i$。
保证所有测试用例中 $n$ 的总和不超过 $10^6$。
输出格式
对于每个测试用例,如果不存在任何合法的填数方案,则输出单行 “No”。
否则,输出的第一行包含字符串 “Yes”。下一行输出 $n$ 个整数,表示在你构造的方案中,每个单元格所在线段的长度。如果存在多个满足要求的方案,你可以输出其中任意一个。
样例
输入样例 1
7 3 0 0 0 4 2 0 0 0 4 0 2 0 0 6 0 3 3 0 3 0 10 2 0 0 3 0 0 4 0 0 1 6 0 0 1 1 0 0 6 1 2 3 4 5 6
输出样例 1
Yes 2 2 1 No Yes 1 2 2 1 No Yes 2 2 3 3 3 4 4 4 4 1 No No