显示原始代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define ULL unsigned long long
#define rep(i, l, b) for (int i = l; i <= b; i++)
#define lep(i, b, l) for (int i = b; i >= l; i--)
const int N = 2e5 + 10, INF = 0x3f3f3f3f3f3f, MOD = 1e7 + 7, B = 13331;
using namespace std;
int n, m;
int a[N], b[N];
map<int, int> mp;
struct DSU {
int n;
vector<int> fa, sz;
DSU(int n) : n(n) { init(n); }
void init(int n) {
fa.resize(n + 1), sz.resize(n + 1);
for (int i = 1; i <= n; i++) fa[i] = i, sz[i] = 1;
}
int find(int x) {
while (x != fa[x]) x = fa[x];
return x;
}
bool same(int u, int v) { return find(u) == find(v); }
void merge(int u, int v) {
int x = find(u);
int y = find(v);
if (x == y)
return;
if (sz[x] < sz[y])
std::swap(x, y);
sz[x] = sz[x] + sz[y];
fa[y] = x;
}
int size(int x) { return sz[find(x)]; };
};
void solve() {
mp.clear();
cin >> n;
rep(i, 1, n) cin >> a[i];
rep(i, 1, n) cin >> b[i];
DSU dsu(n);
rep(i, 1, n) { dsu.merge(a[i], b[i]); }
int ans = 0;
rep(i, 1, n) {
int idx = dsu.find(i);
if (!mp[idx]) {
mp[idx] = 1;
ans += dsu.size(idx) - 1;
}
}
cout << ans * 2 << endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int _ = 1;
while (_--) {
solve();
}
return 0;
}