哈哈哈, 之前做过一道置换环的题目, 但是当时不知道这是置换环
昨天写这道题目时老眼昏花, 读错题目, 如今一朝有悟,甄至化境
原题
E. Sakurako, Kosuke, and the Permutation

思路
这道题目与排序的不同在于, 如果第 i 个数不等于 i, 但是第 i 个数指向的数等于 i, 那么也是正确的, 所以判断需要交换的次数时只有当环内数量大于 2 时才会算入其中
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 200010;
int n, m;
void solve()
{
	cin >> n;
	
	vector<int> p(n + 1);
	
	for (int i = 1; i <= n; i ++ ) cin >> p[i];
	
	vector<int> vis(n + 1, 0);
	
	int ans = 0;
	
	for (int i = 1; i <= n; i ++ )
	{
		if (vis[i]) continue;
		
		int len = 0;
		int x = i;
		
		while (!vis[x])
		{
			vis[x] = 1;
			x = p[x];
			len ++;
		}
		
		ans += (len + 1) / 2 - 1;
	}
	cout << ans << "\n";
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	
	int T = 1;
	cin >> T;
	for (int i = 1; i <= T; i ++ )
	{
		solve();
	}
	
	return 0;
}


















