#PTXB2524. 【2025年莆田市C++专项选拔线下决赛-初中组】T4:魔法石

【2025年莆田市C++专项选拔线下决赛-初中组】T4:魔法石

题目描述

在遥远的“数域王国”,有一个特殊的试炼场——交换广场。这里有一个传奇的试炼,称为“数列排序挑战”。试炼的主角是一名年轻的勇士,名叫阿尔法。阿尔法得到了一个任务:他需要将一组神秘的数字石从小到大排序。每个数字石上刻着不同的数字,且这些数字之间没有任何重复。

每当阿尔法站在广场的中央时,他会发现这些数字石被随机放置在广场的不同位置,而阿尔法手中的魔法杖赋予了他一种特殊能力——交换魔法。这个魔法允许他每次交换任意两颗数字石的位置,但每次交换后,他只能得到一个非常小的提示:“当前石头序列离完全排序还有几步之遥。”

阿尔法决定尽可能高效地完成这个任务,希望尽量少地使用交换魔法,以节省时间和体力。那么问题来了:阿尔法最少需要多少次交换,才能让这些数字石按从小到大的顺序排列呢?

简单来说定一个数列 aa,这个数列满足 aiaja_i \not =a_jiji\not=j​),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换?

输入格式

第一行是一个整数,代表数字个数 nn

第二行有 nn 个整数用空格分隔开,表示数列 aa

输出格式

只有一行,包含一个数,表示最少的交换次数。

样例

8
8 23 4 16 77 1 53 100
5
5
1 4 3 2 5
1

数据范围

对于 20%20 \% 的数据,1n21 \le n \le 21<ai<21\lt a_i\lt2

对于另外 40%40\% 的数据,1n10001\le n\le10001<ai<10001\lt a_i\lt1000aiai1a_i \le a_{i-1}

对于 100%100\% 的数据,1n1051\le n \le 10^51<ai<1051 \lt a_i \lt 10^{5}