voidwork(int u){ int ffa = dsu.find(fa[u]), fffa = dsu.find(fa[ffa]), ffffa = dsu.find(fa[fffa]); ans -= getcnt(u) + getcnt(ffa) + getcnt(fffa) + getcnt(ffffa); --s[ffa], --t[fffa], --w[ffffa]; for (auto v : G[u]) { if (v == fa[u]) continue; int fv = dsu.find(v); dsu.fa[fv] = ffa; ans -= getcnt(fv); s[ffa] += s[fv], t[ffa] += t[fv], w[ffa] += w[fv]; --t[ffa], w[ffa] -= s[fv]; --w[fffa], w[fffa] += t[fv], t[fffa] += s[fv]; w[ffffa] += s[fv]; } ans += getcnt(ffa) + getcnt(fffa) + getcnt(ffffa); }
voiddickdreamer(){ std::cin >> n; for (int i = 1; i < n; ++i) { int u, v; std::cin >> u >> v; G[u].emplace_back(n + i), G[n + i].emplace_back(u); G[v].emplace_back(n + i), G[n + i].emplace_back(v); } dfs(n); dsu.init(2 * n - 1); for (int i = 1; i <= 2 * n - 1; ++i) ans += getcnt(i); for (int i = 1; i <= n; ++i) { std::cout << ans << '\n'; work(i); } }