给定一个包含 $n$ 个正整数的数组 $a_1, a_2, \dots, a_n$。你可以执行任意次数的以下操作:选择若干个不同的下标 $i_1, i_2, \dots, i_k$ ($1 \le i_j \le n$),并将位置 $i_1$ 上的数移动到位置 $i_2$,位置 $i_2$ 上的数移动到位置 $i_3$,以此类推,将位置 $i_k$ 上的数移动到位置 $i_1$。换句话说,该操作对元素进行循环移位:$i_1 \to i_2 \to \dots \to i_k \to i_1$。
例如,若 $n = 4$,数组为 $a_1 = 10, a_2 = 20, a_3 = 30, a_4 = 40$,选择三个下标 $i_1 = 2, i_2 = 3, i_3 = 4$,则操作后的数组变为 $a_1 = 10, a_2 = 40, a_3 = 20, a_4 = 30$。
你的目标是以最少的操作次数将数组按非递减顺序排序。附加限制是所有操作的循环长度之和必须小于或等于 $s$。如果无法在满足该限制的情况下对数组进行排序,你的程序应报告这一点。
输入格式
输入的第一行包含两个整数 $n$ 和 $s$ ($1 \le n \le 200\,000, 0 \le s \le 200\,000$),分别表示数组中元素的个数和循环长度之和的上限。
下一行包含 $n$ 个整数 $a_1, a_2, \dots, a_n$(数组元素,$1 \le a_i \le 10^9$)。
输出格式
如果无法使用总长度不超过 $s$ 的循环将数组排序,输出一个数字 “-1”。
否则,输出一个数字 $q$,表示将数组排序所需的最少操作次数。
在接下来的 $2q$ 行中,按操作顺序输出操作描述。第 $i$ 次操作的描述以一行包含一个整数 $k$ ($1 \le k \le n$) 开始,表示循环的长度(即所选下标的个数)。下一行应包含 $k$ 个不同的整数 $i_1, i_2, \dots, i_k$ ($1 \le i_j \le n$),表示循环的下标。
这些循环的长度之和应小于或等于 $s$,且在应用这 $q$ 次操作后数组应已排序。
如果存在多种最优的 $q$ 种操作方案,输出其中任意一种即可。
子任务
- 子任务 1 (5 分):$n, s \le 2$,且数组中所有元素均为 1 或 2。
- 子任务 2 (5 分):$n \le 5$。
- 子任务 3 (5 分):数组中所有元素均为 1 或 2。
- 子任务 4 (10 分):数组仅包含 1 到 $n$ 的数字,每个数字恰好出现一次,$s = 2 \cdot n$。
- 子任务 5 (10 分):数组仅包含 1 到 $n$ 的数字,每个数字恰好出现一次,$n \le 1000$。
- 子任务 6 (15 分):数组仅包含 1 到 $n$ 的数字,每个数字恰好出现一次。
- 子任务 7 (15 分):$s = 2 \cdot n$。
- 子任务 8 (15 分):$n \le 1000$。
- 子任务 9 (20 分):无附加限制。
样例
样例输入 1
5 5 3 2 3 1 1
样例输出 1
1 5 1 4 2 3 5
样例输入 2
4 3 2 1 4 3
样例输出 2
-1
样例输入 3
2 0 2 2
样例输出 3
0
样例输入 4
6 9 6 5 4 3 2 1
样例输出 4
2 6 1 6 2 5 3 4 3 3 2 1
样例输入 5
6 8 6 5 4 3 2 1
样例输出 5
3 2 3 4 4 1 6 2 5 2 2 1
说明
在第一个样例中,也可以通过两次总长度为 5 的操作来排序:首先应用循环 $1 \to 4 \to 1$(长度为 2),然后应用循环 $2 \to 3 \to 5 \to 2$(长度为 3)。然而,这会得到错误的答案,因为题目要求使用最少的操作次数,在本例中为 1。
在第二个样例中,可以通过两个总长度为 4 的循环($1 \to 2 \to 1$ 和 $3 \to 4 \to 3$)对数组进行排序。然而,无法在 $s = 3$ 的限制下使用更短的循环实现同样的效果。
在第三个样例中,数组已经有序,因此不需要任何操作。空循环集合的总长度被视为 0。
注意,样例 1 和 3 包含重复数字,因此它们不满足子任务 4、5 和 6 的要求。样例 2、4 和 5 满足子任务 5 和 6 的要求。