int fa[100005], A[100005], B[100005]; bool used[100005]; std::unordered_map<int, std::unordered_map<int, int> > mp; intfind(constint x){return fa[x] == x ? fa[x] : fa[x] = find(fa[x]);} structnode { int id, v; inlinebooloperator < (const node x) const {return v < x.v;} inlinebooloperator < (constint x) const {return v < x;} } b[100005];
intmain(){ int n, ans(0); scanf("%d", &n); for (inti(1); i <= n; ++ i) scanf("%d", A + i); for (inti(1); i <= n; ++ i) scanf("%d", B + i); for (inti(1); i <= n; ++ i) fa[i] = i; int m; scanf("%d", &m); while (m --) { int u, v; scanf("%d%d", &u, &v); ++ u, ++ v; fa[find(u)] = find(v); } for (inti(1); i <= n; ++ i) ++ mp[find(i)][B[i]]; for (inti(1); i <= n; ++ i) if (!mp[find(i)][A[i]]) ++ ans; else -- mp[find(i)][A[i]]; returnprintf("%d", ans), 0; }
int fa[100005], cnt[100005]; bool mark[100005]; intfind(constint x){return fa[x] == x ? x : fa[x] = find(fa[x]);} inlinevoidmerge(constint x, constint y){ if (find(x) != find(y)) cnt[find(y)] += cnt[find(x)], fa[find(x)] = find(y); }
intmain(){ int n, m, k, ans(0); scanf("%d%d%d", &n, &m, &k); for (inti(1); i <= n; ++ i) fa[i] = i, cnt[i] = 1; while (m --) { int u, v; scanf("%d%d", &u, &v); merge(u, v); } for (inti(1); i <= n; ++ i) if (!mark[find(i)]) mark[find(i)] = true, ans += ceil(1.00 * cnt[find(i)] / k); returnprintf("%d", ans), 0; }