题目描述
梦想从几时开始,命运在何处终结?
有一个长度为 n 的整数序列 {a1,a2,⋯,an}。
你的任务是判断是否可以将其划分为 k 的倍数个非空子序列,使得每个元素在恰一个子序列中出现,同时每个子序列均以 k 的倍数开头、k 的倍数结尾,并且长度也为 k 的倍数。若能划分,求出任意一个方案。
序列 {a1,a2,⋯,an} 的一个子序列是指将任意多个(可以为 0 个)元素删除后,将其他元素按照原序列中的顺序拼接而成的序列。例如,序列 {9,8,5}、序列 {7} 和序列 {9,8,7,6,5} 均为序列 {9,8,7,6,5} 的子序列,但 {7,9,8} 不是。
输入格式
输入的第一行包含一个整数 T —— 表示子任务编号(与「数据范围与提示」中编号相同,样例的子任务编号为 0)。
第二行包含两个空格分隔的正整数 n,k —— 序列 a 的长度和 k 的值。
第三行包含 n 个空格分隔的正整数 a1,a2,⋯,an —— 依次表示序列 a 的元素。
输出格式
若有解,则第一行输出 Yes
,否则第一行输出 No
。
若有解则按以下格式输出任意一个划分方案:
第二行输出一个整数 c 表示划分成了 c 个子序列,满足 k≤c≤n 且 c 是 k 的倍数;
接下来 c 行每行描述一个子序列:
第 i 行第一个整数 li 表示第 i 个子序列的长度,满足 k≤li≤n 且 li 是 k 的倍数。
接下来 li 个整数 pi,1,pi,2,⋯,pi,li 表示这个子序列中元素的下标。满足 pi,j<pi,j+1(即下标单调递增)且 api,1 和 api,li 是 k 的倍数。
另外,1∼n 中每个数在 p 中出现且仅出现一次。
0
6 2
2 4 1 3 6 8
Yes
2
2 1 5
4 2 3 4 6
0
6 2
2 4 6 1 3 5
No
0
6 2
2 1 2 2 1 2
Yes
2
4 1 2 5 6
2 3 4
0
15 3
3 1 1 1 1 3 3 1 3 3 1 1 1 1 3
Yes
3
6 1 2 3 4 5 10
6 6 11 12 13 14 15
3 7 8 9
数据范围与提示
对于所有数据,有 2≤k,n≤106,0≤ai≤106。
Subtask # |
分值 |
n 的限制 |
k 的限制 |
特殊限制 |
1 |
5 |
n≤10 |
k=2 |
- |
2 |
10 |
n≤20 |
k≤20 |
3 |
n≤5×104 |
k=2 |
4 |
15 |
n≤102 |
k≤3 |
5 |
10 |
n≤103 |
k≤103 |
6 |
n≤5×104 |
k≤5×104 |
a1,a2,⋯,ak 是 k 的倍数 |
7 |
存在方案使得 a1 和 an 属于同一子序列 |
8 |
15 |
- |
9 |
n≤106 |
k≤106 |