提交时间:2026-01-10 14:33:44
运行 ID: 39453
#include <iostream> #include <numeric> #include <set> #include <utility> #include <vector> using namespace std; using i64 = long long; struct DSU { vector<int> siz, fa, val; DSU(int n) : siz(n, 1) , fa(n) , val(n) { iota(fa.begin(), fa.end(), 0); } int leader(int u) { while (u != fa[u]) u = fa[u] = fa[fa[u]]; return u; } void merge(int u, int v) { u = leader(u); v = leader(v); if (u == v) return; if (siz[u] < siz[v]) swap(u, v); siz[u] += siz[v]; val[u] += val[v]; fa[v] = u; } bool is_same(int u, int v) { return leader(u) == leader(v); } bool is_root(int u) { return leader(u) == u; } int get_val(int u) { return val[leader(u)]; } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n, k; cin >> n >> k; vector<set<int>> idxs(n + 1); vector<int> idx(n + 1); for (int i = 1; i <= n; ++i) { idx[i] = i; idxs[i].insert(i); } for (int i = 0; i < k; ++i) { int u, v; cin >> u >> v; idxs[u].insert(idx[v]); idxs[v].insert(idx[u]); swap(idx[u], idx[v]); } DSU uf(n + 1); for (int i = 1; i <= n; ++i) uf.merge(i, idx[i]); vector<int> ans(n + 1); for (int i = 1; i <= n; ++i) { set<int> roots; for (auto j : idxs[i]) roots.insert(uf.leader(j)); for (auto root : roots) ++ans[root]; } for (int i = 1; i <= n; ++i) cout << ans[uf.leader(i)] << '\n'; return 0; }