排列
题目描述
染染有一个长度为 n 的排列 1,2,⋯,n。他将这个排列重新排列,并给其中若干个数加上负号,得到了序列 a1,a2,⋯,an。换句话说,序列 a1,a2,⋯,an 满足:
- 任意 ai 的绝对值都是大于等于 1 且小于等于 n 的整数;
- 对于任意 i=j,都有 ∣ai∣=∣aj∣。
其中,∣x∣ 表示 x 的绝对值:当 x≥0 时,∣x∣=x;当 x<0 时,∣x∣=−x。
现在,染染根据这个序列构造出另一个序列 b1,b2,⋯,bn,其中 bi 表示满足 ai+aj>0 的下标 j 的个数。
不幸的是,染染忘记了原来的序列 a1,a2,⋯,an,只模糊记得序列 b1,b2,⋯,bn。请你判断给定的序列 b1,b2,⋯,bn 是否合法。也就是说,是否存在一个满足条件的序列 a1,a2,⋯,an 与之对应;如果存在,请构造出任意一个这样的序列。
数据范围
- 1≤T≤106
- 1≤n≤106
- 0≤bi≤n
- 单个测试点中所有数据的 n 之和不超过 106
输入格式
从标准输入按以下格式读取数据:
T
n
b1 b2 … bn
其中:
- 第一行输入一个整数 T,表示数据组数。
- 对于每组数据,第一行输入一个整数 n,表示序列长度。
- 第二行输入 n 个整数 b1,b2,⋯,bn。
输出格式
对于每组数据:
- 第一行输出字符串
YES 或 NO,表示给定序列是否合法;
- 如果第一行输出
YES,则第二行输出一个对应的序列 a1,a2,⋯,an;
- 如果存在多种合法构造,输出任意一种即可。
样例
3
3
3 3 3
3
1 1 1
5
3 2 2 5 5
YES
1 2 3
NO
YES
1 -3 -2 4 5