#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>
#include <random>
#include <chrono>
using ll = long long;
#define debug(x) #x << " = " << x << '\n'
std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(0);
int n;
std::cin >> n;
std::vector<std::vector<int>> g(n);
for (int i = 1; i < n; i++) {
int u, v;
std::cin >> u >> v;
u--, v--;
// u = i;
// v = rng() % i;
g[u].push_back(v);
g[v].push_back(u);
}
std::vector<int> score(n, 0);
std::vector<int> sz(n);
std::vector<int> dp(n);
int answer = 0;
auto dfs0 = [&](auto &&self, int u, int p) -> void {
sz[u] = 1;
for (int v : g[u]) {
if (v != p) {
self(self, v, u);
sz[u] += sz[v];
}
}
};
auto find_centroid = [&](auto &&self, int u, int p) -> int {
for (int v : g[u]) {
if (v != p && 2 * sz[v] > n) {
return self(self, v, u);
}
}
return u;
};
auto dfs1 = [&](auto &&self, int u, int p) -> void {
if (p != -1) {
g[u].erase(std::find(g[u].begin(), g[u].end(), p));
}
sz[u] = 1;
for (int v : g[u]) {
self(self, v, u);
sz[u] += sz[v];
}
};
dfs0(dfs0, 0, -1);
int centroid = find_centroid(find_centroid, 0, -1);
dfs1(dfs1, centroid, -1);
auto dfs = [&](auto &&self, int u, int k) -> void {
dp[u] = 0;
for (int v : g[u]) {
self(self, v, k);
}
if (sz[u] >= k / 2) {
int max1 = 0, max2 = 0;
for (int v : g[u]) {
if (dp[v] >= max1) {
max2 = max1;
max1 = dp[v];
} else if (dp[v] > max2) {
max2 = dp[v];
}
}
if (max2 > 0) {
answer = std::max(answer, max1 + max2 + 1);
}
dp[u] = 1 + max1;
}
if (u != centroid) {
answer = std::max(answer, 1 + dp[u]);
}
};
for (int k = 1; k <= n; k++) {
if (k % 2 == 1) {
std::cout << 1 << ' ';
continue;
}
answer = 1;
dfs(dfs, centroid, k);
std::cout << answer << ' ';
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |