P15931 [TOPC 2021] A Sorting Problem

题目描述

给定一个数组 $[p[1], p[2], \dots, p[n]]$,其中所有数互不相同,且均为 $1$ 到 $n$ 之间的正整数。你只能对数组执行以下操作:选择两个下标 $x$ 和 $y$,使得 $|p[x] - p[y]| = 1$,然后交换 $p[x]$ 和 $p[y]$ 的值。我们希望将这个数组按升序排序,即对于所有 $i \in \{1, 2, \dots, n\}$,使 $p[i] = i$。例如,我们可以通过两次操作将数组 $[p[1] = 2, p[2] = 3, p[3] = 1]$ 排序: 1. 交换 $p[1]$ 和 $p[3]$。数组变为 $[p[1] = 1, p[2] = 3, p[3] = 2]$。 2. 交换 $p[2]$ 和 $p[3]$。数组变为 $[p[1] = 1, p[2] = 2, p[3] = 3]$,此时数组已按升序排序。 请编写一个程序,计算将给定数组按升序排序所需的最少操作次数。

输入格式

输入包含两行。第一行包含一个整数 $n$。第二行包含 $n$ 个空格分隔的数 $p[1], p[2], \dots, p[n]$,表示数组 $[p[1], p[2], \dots, p[n]]$。

输出格式

输出一个整数,表示将给定数组排序所需的最少操作次数。

说明/提示

- $1 < n \leq 200000$ - $1 \leq p[i] \leq n$ - 所有 $p[i]$ 互不相同。 翻译由 DeepSeek V3.2 完成