CF2033E Sakurako, Kosuke, and the Permutation
题目描述
樱子的考试结束了,她表现得非常出色。作为奖励,她收到了一个排列 $p$。小助因为有一门考试没及格,没有收到礼物,感到很不满。他决定偷偷溜进她的房间(多亏了她门锁的密码),把排列“破坏”成一个简单排列。
一个排列 $p$ 被称为简单排列,当且仅当对于每个 $i$($1\le i \le n$),满足以下两个条件之一:
- $p_i = i$
- $p_{p_i} = i$
例如,排列 $[1, 2, 3, 4]$、$[5, 2, 4, 3, 1]$ 和 $[2, 1]$ 是简单排列,而 $[2, 3, 1]$ 和 $[5, 2, 1, 4, 3]$ 不是。
每次操作,小助可以选择两个下标 $i, j$($1\le i, j\le n$),交换 $p_i$ 和 $p_j$ 的值。
樱子马上就要回家了。你的任务是计算小助最少需要进行多少次操作,才能将排列变成简单排列。
输入格式
第一行包含一个整数 $t$($1\le t\le 10^4$),表示测试用例的数量。
每个测试用例包含两行。
- 第一行包含一个整数 $n$($1\le n \le 10^6$),表示排列 $p$ 的长度。
- 第二行包含 $n$ 个整数 $p_i$($1\le p_i\le n$),表示排列 $p$ 的元素。
保证所有测试用例中 $n$ 的总和不超过 $10^6$。
保证 $p$ 是一个排列。
输出格式
对于每个测试用例,输出一个整数,表示小助将排列变为简单排列所需的最小操作次数。
说明/提示
在第一个和第二个样例中,排列已经是简单排列。
在第四个样例中,只需交换 $p_2$ 和 $p_4$,排列就会变为 $[2, 1, 4, 3]$,只需 $1$ 次操作。
由 ChatGPT 4.1 翻译