QOJ.ac

QOJ

Time Limit: 1 s Memory Limit: 512 MB Total points: 100

#328. 循环排序

Statistics

给定一个包含 $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 的要求。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.