#B366. 不动点

不动点

题目描述

一个长度为 nn 的排列是一个整数序列,使得从 00n1n-1 的每个整数恰好出现一次。例如,序列 [0,2,1][0,2,1] 是长度为 33 的排列,而 [0,2,2][0,2,2][1,2,3][1,2,3] 都不是。

函数的不动点是被该函数映射到自身的点。排列可以被视为一个双射函数。我们可以得到排列中的不动点定义:当且仅当 ai=ia_i = i 时,整数 ii 是排列 a0,a1,,an1a_0, a_1, \ldots, a_{n-1} 的一个不动点。例如,排列 [0,2,1][0,2,1]11 个不动点,排列 [0,1,2][0,1,2]33 个不动点。

现在给定一个排列 aa。你最多允许交换排列中的两个元素一次。你的任务是使结果排列中的不动点个数尽可能多。注意,你最多只能进行一次交换操作。

输入格式

第一行包含一个整数 nn1n1051 \leq n \leq 10^5)。

第二行包含 nn 个整数 a0,a1,...,an1a_0, a_1, ..., a_{n-1},表示给定的排列。

输出格式

输出一个整数,表示在最多进行一次交换操作后,排列中可能获得的不动点的最大数量。

5
0 1 3 4 2
3

原题链接:https://codeforces.com/problemset/problem/347/B