yeah!
纯模拟
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 1e5 + 10;
bool st[N];
int n;
struct node{
int idx;
int v;
}a[N];
int main(){
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i].v;
a[i].idx = i;
}
int cnt = n,ans = 0, flag = 0;
while(cnt > 0){
for(int i = 1; i<= n; i++){
if(a[i].v == i){
if(!st[a[i].v]){
cnt--;
st[a[i].v] = true;
}
if(cnt == 0){
flag = 1;
break;
}
}
else if(a[i].v == a[a[i].v].idx && a[a[i].v].v == a[i].idx && !st[a[i].v]){
cnt -= 2;
int val1 = a[i].v, val2 = a[val1].v;
// cout << val1 <<" " << val2 << endl;
st[val1] = true;
st[val2] = true;
ans++;
//printf("11.a[%d].v=%d,a[a[%d].v].v = %d\n,ans = %d\n",i,a[i].v,i,a[a[i].v].v,ans);
swap(a[i].v,a[a[i].v].v);
//printf("22.a[%d].v=%d,a[a[%d].v].v = %d\n,ans = %d\n",i,a[i].v,i,a[a[i].v].v,ans);
if(cnt == 0){
flag = 1;
break;
}
}
else{
st[a[i].v] = true;
swap(a[i].v,a[a[i].v].v);
cnt--;
ans++;
if(cnt == 0){
flag = 1;
break;
}
}
}
if(flag) break;
}
//for(int i = 1; i <= n; i++){
// cout << a[i].v <<" " << a[i].idx << endl;
// }
cout << ans << endl;
}