CF91D Grocer's Problem

题目描述

昨天,超市杂货区举办了一场展览。展览中有 $n$ 个装有香料的罐子。展览前,这些罐子从左到右依次编号为 $1$ 到 $n$。展览结束后,罐子被移动了位置,现在杂货商需要将它们按编号升序重新排列。 杂货商有一台特殊的机器。每次操作,机器可以取出任意 $5$ 个或更少的罐子,并按杂货商的意愿重新排列它们。注意,所选的罐子不需要在位置上是连续的。例如,对于排列 $2, 6, 5, 4, 3, 1$,可以选择位置 $1, 2, 3, 5, 6$ 上的罐子,将其重新排列成 $1, 2, 3, 4, 5, 6$。 请问,至少需要多少次这样的操作,才能将所有罐子按编号升序排列?

输入格式

第一行包含一个整数 $n$,表示罐子的数量,$1 \leq n \leq 10^5$。 第二行包含 $n$ 个用空格分隔的整数 $a_{i}$,$1 \leq a_{i} \leq n$,第 $i$ 个数表示初始时第 $i$ 个位置上的罐子的编号。保证所有编号均不相同。

输出格式

输出第一行包含一个整数,表示将所有罐子按编号升序排列所需的最少操作次数。接下来的每一次操作,需按照如下格式描述: 每次操作第一行输出要选取的罐子的数量 $k$。 第二行输出 $k$ 个空格分隔的整数,表示取罐子的原位置 $b_{1},b_{2},...,b_{k}$。 第三行输出 $k$ 个空格分隔的整数,表示这些罐子的新位置 $c_{1},c_{2},...,c_{k}$。操作执行后,原位置 $b_{i}$ 的罐子会移动到 $c_{i}$ 的位置。要求 $(c_{1},...,c_{k})$ 必须是 $(b_{1},...,b_{k})$ 的一个全排列。 如果有多种方案,输出任意一种均可。

说明/提示

以第一个样例为例,排序可以通过两次操作完成。 第一次操作选择位置 $1, 3, 6, 4$ 处的罐子,将原本在位置 $1$ 的罐子放到位置 $3$,原本在位置 $3$ 的罐子放到位置 $6$,原本在位置 $6$ 的罐子放到位置 $4$,原本在位置 $4$ 的罐子放到位置 $1$。 操作后,排列顺序变为:$1, 5, 3, 4, 2, 6$。 第二次操作选择位置 $2$ 和 $5$ 处的罐子,交换它们的位置。 由 ChatGPT 5 翻译