#P16595. [GKS 2016 #E] Sorting Array

[GKS 2016 #E] Sorting Array

题目描述

我们正在设计一种有点另类的排序算法,用于对包含 11NN 所有整数的数组 AA 进行排序。AA 中的整数最初可以是任意顺序。除了输入顺序外,该算法还依赖于两个整数 PPPP 不超过 33)和 KK。算法的执行过程如下:

  1. AA 划分为 KK 个互不相交的非空子数组 A1,A2,,AKA_1, A_2, \dots, A_K,使得按顺序 A1A2AKA_1 A_2 \dots A_K 拼接起来恰好得到 AA
  2. 分别对每个子数组进行排序。
  3. 选择至多 PP 个子数组,并任意多次交换这些子数组中的任意两个。

例如,考虑 A=[1 5 4 3 2]A = [1 \ 5 \ 4 \ 3 \ 2]P=2P = 2。一种可能的划分为 K=4K = 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]

我们希望通过以下方式证明该算法适用于分布式环境:对于给定的输入和 PP 值,找出最大的分区数 KK,使得通过合理选择分区和交换,可以将原始顺序排序。你能帮助我们计算出这个 KK 吗?

输入格式

输入的第一行给出测试用例的数量 TT

接下来有 TT 个测试用例。每个测试用例由两行组成。第一行包含两个整数 NNPP,含义如上所述。

测试用例的第二行包含 NN 个整数 X1,X2,,XNX_1, X_2, \dots, X_N,表示数组 AA

输出格式

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

5
5 2
1 5 4 3 2
5 2
4 5 1 2 3
6 2
6 3 5 2 4 1
5 3
4 5 1 2 3
6 3
1 2 6 4 5 3
Case #1: 4
Case #2: 2
Case #3: 3
Case #4: 3
Case #5: 6

提示

样例 #1:

与题目描述中的例子相同。

样例 #2:

[4 5] [1 2 3][4 \ 5] \ [1 \ 2 \ 3]

交换两个块:[1 2 3] [4 5][1 \ 2 \ 3] \ [4 \ 5]

样例 #3:

[6] [3 5 2 4] [1][6] \ [3 \ 5 \ 2 \ 4] \ [1]

[3 5 2 4][3 \ 5 \ 2 \ 4] 排序,然后交换 [6][6][1][1],得到:[1] [2 3 4 5] [6][1] \ [2 \ 3 \ 4 \ 5] \ [6]

样例 #4:

[4 5] [1] [2 3][4 \ 5] \ [1] \ [2 \ 3]

交换 [4 5][4 \ 5][1][1],然后交换 [2 3][2 \ 3][4 5][4 \ 5][1] [2 3] [4 5][1] \ [2 \ 3] \ [4 \ 5]

样例 #5:

[1] [2] [6] [4] [5] [3][1] \ [2] \ [6] \ [4] \ [5] \ [3]

交换 [6][6][3][3][1] [2] [3] [4] [5] [6][1] \ [2] \ [3] \ [4] \ [5] \ [6]

注意:前 33 个样例不会出现在大数据集中,后 22 个样例不会出现在小数据集中。

限制条件

1T1001 \le T \le 100

1N50001 \le N \le 5000

对所有 ii1XiN1 \le X_i \le N

对所有 iji \ne jXiXjX_i \ne X_j

小数据集(测试集 1 – 可见)

P=2P = 2

大数据集(测试集 2 – 隐藏)

P=3P = 3

翻译由 DeepSeek V4 Pro 完成