#L2818. 「eJOI2018」循环排序
「eJOI2018」循环排序
题目描述
本题译自 eJOI2018 Problem F. Cycle Sort
给定一个长为 的数列 ,你可以多次进行如下操作:
选定 个不同的下标 (其中 ),然后将 移动到下标 处,将 移动到下标 处,……,将 移动到下标 处,将 移动到下标 处。
换言之,你可以按照如下的顺序轮换元素:$i_1 \rightarrow i_2 \rightarrow i_3 \rightarrow \cdots \rightarrow i_{k-1} \rightarrow i_k \rightarrow i_1$。
例如:,,,,,则操作完成后的 数列变为 。
你的任务是用操作次数最少的方法将整个数列排序成不降的。注意,所有操作中选定下标的个数总和不得超过 。如果不存在这样的方法(无解),输出 。
输入格式
第一行, 个整数, 和 $(1 \le n \le 2 \times 10^5, 0 \le s \le 2 \times 10^5)$。
第二行, 个整数 ,表示数列 ,其中 。
输出格式
如果无解,仅输出 。
否则,第一行输出一个整数 (可以为 ,参见样例 ),表示最少需要进行的操作次数。
接下来 行描述每次操作。
对于每次操作,先输出一个整数 表示此操作选定的下标数量,然后在下一行中输出 个整数 。
在操作次数 最少的情况下,你可以输出任意一种可行方案。
样例 1
输入
5 5
3 2 3 1 1
输出
1
5
1 4 2 3 5
你可以用两次操作 和 排序数组,但这样会 WA,因为你的任务是最小化 ,而最优解的 。 一种可行的方法是 $1 \rightarrow 4 \rightarrow 2 \rightarrow 3 \rightarrow 5 \rightarrow 1$,即样例输出。
样例 2
输入
4 3
2 1 4 3
输出
-1
所有操作中选定下标的个数总和的最小值为 (一种可行的方法是 和 ),因此无解。
样例 3
输入
2 0
2 2
输出
0
数组已经有序,因此不需要进行操作。
样例 4
输入
6 9
6 5 4 3 2 1
输出
2
6
1 6 2 5 3 4
3
3 2 1
样例 5
输入
6 8
6 5 4 3 2 1
输出
3
2
3 4
4
1 6 2 5
2
2 1
样例 和 满足子任务 和 的限制。
数据范围与提示
| 子任务编号 | 分数 | 限制 |
|---|---|---|
| 1 | 0 | 样例 |
| 2 | 5 | 且 |
| 3 | ||
| 4 | ||
| 5 | 10 | 中 到 的所有正整数出现且恰好只出现一次, |
| 6 | 中 到 的所有正整数出现且恰好只出现一次, | |
| 7 | 15 | 中 到 的所有正整数出现且恰好只出现一次 |
| 8 | ||
| 9 | ||
| 10 | 20 | 无特殊限制 |