P16595 [GKS 2016 #E] Sorting Array

题目描述

我们正在设计一种有点另类的排序算法,用于对包含 $1$ 到 $N$ 所有整数的数组 $A$ 进行排序。$A$ 中的整数最初可以是任意顺序。除了输入顺序外,该算法还依赖于两个整数 $P$($P$ 不超过 $3$)和 $K$。算法的执行过程如下: 1. 将 $A$ 划分为 $K$ 个互不相交的非空子数组 $A_1, A_2, \dots, A_K$,使得按顺序 $A_1 A_2 \dots A_K$ 拼接起来恰好得到 $A$。 2. 分别对每个子数组进行排序。 3. 选择至多 $P$ 个子数组,并任意多次交换这些子数组中的任意两个。 例如,考虑 $A = [1 \ 5 \ 4 \ 3 \ 2]$ 且 $P = 2$。一种可能的划分为 $K = 4$ 个互不相交的子数组: ``` A1 = [1] A2 = [5] A3 = [4] A4 = [3 2] 排序后: A1 = [1] A2 = [5] A3 = [4] A4 = [2 3] 交换 A4 与 A2 后: A1 = [1] A2 = [2 3] A3 = [4] A4 = [5] ``` 我们希望通过以下方式证明该算法适用于分布式环境:对于给定的输入和 $P$ 值,找出最大的分区数 $K$,使得通过合理选择分区和交换,可以将原始顺序排序。你能帮助我们计算出这个 $K$ 吗?

输入格式

输入的第一行给出测试用例的数量 $T$。 接下来有 $T$ 个测试用例。每个测试用例由两行组成。第一行包含两个整数 $N$ 和 $P$,含义如上所述。 测试用例的第二行包含 $N$ 个整数 $X_1, X_2, \dots, X_N$,表示数组 $A$。

输出格式

对于每个测试用例,输出一行,格式为 `Case #x: y`,其中 $x$ 是测试用例编号(从 $1$ 开始),$y$ 是参数 $K$ 的最大可能值。

说明/提示

样例 #1: 与题目描述中的例子相同。 样例 #2: $[4 \ 5] \ [1 \ 2 \ 3]$ 交换两个块:$[1 \ 2 \ 3] \ [4 \ 5]$ 样例 #3: $[6] \ [3 \ 5 \ 2 \ 4] \ [1]$ 对 $[3 \ 5 \ 2 \ 4]$ 排序,然后交换 $[6]$ 与 $[1]$,得到:$[1] \ [2 \ 3 \ 4 \ 5] \ [6]$ 样例 #4: $[4 \ 5] \ [1] \ [2 \ 3]$ 交换 $[4 \ 5]$ 与 $[1]$,然后交换 $[2 \ 3]$ 与 $[4 \ 5]$:$[1] \ [2 \ 3] \ [4 \ 5]$ 样例 #5: $[1] \ [2] \ [6] \ [4] \ [5] \ [3]$ 交换 $[6]$ 与 $[3]$:$[1] \ [2] \ [3] \ [4] \ [5] \ [6]$ **注意**:前 $3$ 个样例不会出现在大数据集中,后 $2$ 个样例不会出现在小数据集中。 ### 限制条件 $1 \le T \le 100$。 $1 \le N \le 5000$。 对所有 $i$,$1 \le X_i \le N$。 对所有 $i \ne j$,$X_i \ne X_j$。 **小数据集(测试集 1 – 可见)** $P = 2$。 **大数据集(测试集 2 – 隐藏)** $P = 3$。 翻译由 DeepSeek V4 Pro 完成