书架还原
题号:NC309137
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

在一个偏远的图书馆里,有个书架上放着 n 本书,每本书上都标有一个从 1n 的唯一编号。

按照规矩,这些书应该按编号从小到大依次排列:1 号书位于最左端,2 号书紧随其后,以此类推,直到 n 号书在最右端。这样的顺序不仅看起来整齐,也方便读者快速找到想借的书。

可昨天店里人来人往,借书还书忙得不可开交,书架上的顺序出现了错乱。现在,书架上的书变成了 a = (a_1, a_2, \ldots, a_n),其中 a_i 表示第 i 个位置上的书编号。

管理员决定动手整理书架,但时间有限,他希望用最少的操作把书的顺序恢复到正确的排列。每次操作,他可以挑选书架上任意两本书,交换它们的位置。例如,如果当前排列是 (3, 1, 2),他可以交换第 1 本和第 2 本,得到 (1, 3, 2),再交换第 2 本和第 3 本,得到 (1, 2, 3)

你的任务是帮助管理员计算,最少需要进行多少次操作,才能让书架上的书的编号排列变为 (1, 2, \ldots, n)

输入描述:

输入的第一行包含一个正整数 n,表示书架上书的总数。

第二行包含 n 个正整数 a_1, a_2, \ldots, a_n,相邻整数之间使用一个空格分隔,依次表示当前书架上每本书的编号。a_1, a_2, \ldots, a_n 是一个 1n 的排列。

- 对于所有评测用例,1 \leq n \leq 10^61 \leq a_i \leq na_1, a_2, \dots, a_n 各不相同。

输出描述:

输出一行包含一个整数表示答案,即将书架上的书恢复到正确排列所需的最少操作次数。
示例1

输入

复制
3
3 1 2

输出

复制
2