#P50910. 「eJOI2018」循环排序

「eJOI2018」循环排序

题目描述

本题译自 eJOI2018 Problem F. Cycle Sort

给定一个长为 nn 的数列 {ai}\{a_i\} ,你可以多次进行如下操作:
选定 kk 个不同的下标 i1,i2,,iki_1, i_2, \cdots, i_k(其中 1ijn1 \le i_j \le n),然后将 ai1a_{i_1} 移动到下标 i2i_2 处,将 ai2a_{i_2} 移动到下标 i3i_3 处,……,将 aik1a_{i_{k-1}} 移动到下标 iki_{k} 处,将 aika_{i_k} 移动到下标 i1i_1 处。

换言之,你可以按照如下的顺序轮换元素:i1i2i3ik1iki1i_1 \rightarrow i_2 \rightarrow i_3 \rightarrow \cdots \rightarrow i_{k-1} \rightarrow i_k \rightarrow i_1

例如:n=4,{ai}={10,20,30,40},i1=2,i2=3,i3=4n=4, \{a_i\}=\{ 10, 20, 30, 40\}, i_1=2, i_2=3, i_3=4 ,则操作完成后的 aa 数列变为 {10,40,20,30}\{ 10, 40, 20, 30\}

你的任务是用操作次数最少的方法将整个数列排序成不降的。注意,所有操作中选定下标的个数总和不得超过 ss 。如果不存在这样的方法(无解),输出 -1\texttt{-1}

输入格式

第一行, 22 个整数, nns (1n2×105,0s2×105)s\ (1 \le n \le 2 \times 10^5, 0 \le s \le 2 \times 10^5)
第二行, nn 个整数 a1,a2,a3,ana_1, a_2, a_3, \cdots a_n,表示数列 {ai}\{a_i\} ,其中 1ai1091 \le a_i \le 10^9

输出格式

如果无解,仅输出 -1\texttt{-1}
否则,第一行输出一个整数 qq (可以为 00 ,参见样例 3 ),表示最少需要进行的操作次数。
接下来 2×q2 \times q 行描述每次操作。
对于每次操作,先输出一个整数 kk 表示此操作选定的下标数量,然后在下一行中输出 kk 个整数 i1,i2,,iki_1, i_2, \cdots, i_k
在操作次数 qq 最少的情况下,你可以输出任意一种可行方案。

样例 1

5 5
3 2 3 1 1
1
5
1 4 2 3 5

你可以用两次操作 1411 \rightarrow 4 \rightarrow 123522 \rightarrow 3 \rightarrow 5 \rightarrow 2 排序数组,但这样会 WA,因为你的任务是最小化 qq ,而最优解的 q=1q=1。 一种可行的方法是 1423511 \rightarrow 4 \rightarrow 2 \rightarrow 3 \rightarrow 5 \rightarrow 1,即样例输出。

4 3
2 1 4 3
-1

所有操作中选定下标的个数总和的最小值为 44 (一种可行的方法是 1211 \rightarrow 2 \rightarrow 13433 \rightarrow 4 \rightarrow 3),因此无解。

2 0
2 2
0

数组已经有序,因此不需要进行操作。

6 9
6 5 4 3 2 1
2
6
1 6 2 5 3 4
3
3 2 1
6 8
6 5 4 3 2 1
3
2
3 4
4
1 6 2 5
2
2 1

样例 4 和 5 满足子任务 6 和 7 的限制。

数据范围与提示

数据限制

子任务编号 分数 限制
11 00 样例
22 55 n,s2n, s \le 21ai21 \le a_i \le 2
33 55 n5n \le 5
44 55 1ai21 \le a_i \le 2
55 1010 {ai}\{a_i\}11nn 的所有正整数出现且恰好只出现一次, s=2×ns=2 \times n
66 1010 {ai}\{a_i\}11nn 的所有正整数出现且恰好只出现一次, n1000n \le 1000
77 1515 {ai}\{a_i\}11nn 的所有正整数出现且恰好只出现一次
88 1515 s=2×ns=2 \times n
99 1515 n1000n \le 1000
1010 2020 无特殊限制