在練習了數繪(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