题目描述
在本题中,提到“顺序”时,指的是 (1,2,⋯,N) 的一个排列。
对于一个排列 a=(a1,a2,⋯,aN),定义 f(a) 为 a 的循环节(cycle)的个数。更准确地说,f(a) 的值定义如下:
- 考虑一个有 N 个顶点、编号为 1 到 N 的无向图。对于每个 1≤i≤N,在顶点 i 和顶点 ai 之间连一条边。此时,该图的连通分量个数即为 f(a)。
给定一个排列 P=(P1,P2,⋯,PN) 和一个整数 K。判断是否存在一个排列 x,使得下列条件成立,并在存在时构造出一个解:
- 令 yi=Pxi,从而得到排列 y。
- 满足 f(x)+f(y)=K。
对于每个输入文件,需要解答 T 个测试用例。
输入格式
输入以如下格式从标准输入读入:
T
case1
case2
⋮
caseT
每个测试用例的格式如下:
N K P1 P2 ⋯ PN
输出格式
对于每个测试用例,如果不存在满足条件的排列 x,输出 No。如果存在,输出如下格式的答案:
Yes x1 x2 ⋯ xN
输出 Yes 或 No 时,字母大小写均可。若存在多个解,输出任意一个均可。
样例 1
输入
3
3 3
1 3 2
2 2
2 1
4 8
1 2 3 4
输出
Yes
2 1 3
No
Yes
1 2 3 4
说明/提示
数据范围
- 1≤T≤105
- 2≤N≤2×105
- 2≤K≤2N
- (P1,P2,⋯,PN) 是 (1,2,⋯,N) 的一个排列
- 每个输入文件中所有 N 的总和不超过 2×105
- 输入的所有数均为整数
样例解释 1
在第 1 个测试用例中,取 x=(2,1,3),则 y=(3,1,2),此时 f(x)+f(y)=2+1=3。
由 ChatGPT 4.1 翻译