哈哈哈, 之前做过一道置换环的题目, 但是当时不知道这是置换环
昨天写这道题目时老眼昏花, 读错题目, 如今一朝有悟,甄至化境
原题
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;
}