#P16900. [GKS 2022 #H] Level Design

    ID: 19228 远端评测题 10000ms 1024MiB 尝试: 0 已通过: 0 难度: 7 上传者: 标签>动态规划 DP并查集单调队列2022背包 DP置换Google Kick Start

[GKS 2022 #H] Level Design

题目描述

在排列 CC 中,一个置换循环是一个整数序列 (a1,a2,,ak)(a_1, a_2, \ldots, a_k),满足以下条件:

  • 对所有 iiaiCa_i \in C,且互不相同。
  • 对每个 i{1,2,,k1}i \in \{1, 2, \ldots, k-1\}C[ai]=ai+1C[a_i] = a_{i+1},且 C[ak]=a1C[a_k] = a_1

长度为 kk 的置换循环称为 kk-循环

例如,排列 C=[4,2,1,3]C = [4, 2, 1, 3] 有两个循环:33-循环 (4,3,1)(4, 3, 1)11-循环 (2)(2)(4,3,1)(4, 3, 1) 是一个循环,因为 C[4]=3C[4] = 3C[3]=1C[3] = 1,且 C[1]=4C[1] = 4

:::align{center} :::

Grace 喜欢置换循环,于是 Charles 决定设计一个 NN 级游戏来挑战她。

游戏开始时,玩家会得到一个长度为 NN 的排列 PP,其中包含整数 11NN。游戏级数编号为 11NN。在每个级别,玩家从给定的排列开始,并可以通过交换其中任意两个元素来修改它(可以进行多次交换)。要通关第 kk 级,玩家需要找出在排列中创建一个 kk-循环所需的最小交换次数。玩家只有在通关第 kk 级后才能进入第 (k+1)(k+1) 级。

Grace 觉得这个游戏有点挑战性,但她不惜一切代价想要获胜。她需要你的帮助!形式化地说,对于每个级别 kk,你需要求出在排列中创建一个 kk-循环所需的最小交换次数。

输入格式

输入的第一行给出测试用例的数量 TT。接下来有 TT 个测试用例。

每个测试用例的第一行包含一个整数 NN:排列的长度。

下一行包含 NN 个整数 P1,P2,,PNP_1, P_2, \ldots, P_N,其中第 ii 个整数表示排列 PP 中的第 ii 个元素。

输出格式

对于每个测试用例,输出一行,格式为 Case #x: S1 S2 ... SN,其中 xx 是测试用例编号(从 11 开始),SiS_i 是游戏中第 ii 级的答案,即在排列中创建一个 ii-循环所需的最小交换次数。

2
3
1 2 3
4
4 2 1 3
Case #1: 0 1 2
Case #2: 0 1 0 1

提示

在样例 #1 中,给定排列中有三个 11-循环。因此,第一级可以用零次交换通关。要通关第二级,我们可以交换前两个元素得到排列 [2,1,3][2, 1, 3],其中包含 22-循环 (2,1)(2, 1)。要通关第三级,我们可以交换前两个元素,然后交换第二个和第三个元素,得到排列 [2,3,1][2, 3, 1],其中包含 33-循环 (2,3,1)(2, 3, 1)

在样例 #2 中,如前所述,排列包含 11-循环 (2)(2)。因此,通关第一级需要零次交换。要通关第二级,我们可以交换最后两个元素得到排列 [4,2,3,1][4, 2, 3, 1],其中包含 22-循环 (4,1)(4, 1)。由于排列中也有 33-循环 (4,3,1)(4, 3, 1),因此第三级也可以用零次交换通关。要通关第四级,我们可以交换第二个和第四个元素得到排列 [4,3,1,2][4, 3, 1, 2],其中包含 44-循环 (4,2,3,1)(4, 2, 3, 1)

限制条件

1T1001 \le T \le 100

对于所有 ii1PiN1 \le P_i \le N

所有 PiP_i 互不相同。

测试集 1

1N1031 \le N \le 10^3

测试集 2

1N1051 \le N \le 10^5

翻译由 DeepSeek V4 Pro 完成