#include <bits/stdc++.h>
using namespace std;
#define int long long
#define FOR(i,a,b) for (int i = (a); i < (b); ++i)
#define pb push_back
#define all(a) a.begin(), a.end()
#define endl "\n"
void printVector(vector<int> a){
	for (auto x: a) cout << x << " ";
	cout << endl;
}
vector<vector<int>> graph;
vector<int> subtree, subtree1;
vector<int> vis;
int dp(int x, int p = -1){
    if (vis[x]) return 0;
    subtree[x] = 1;
    for (auto node: graph[x]){
        if (node == p) continue;
        subtree[x] += dp(node, x);
    }
    return subtree[x];
}
int find_centroid(int x, int p, int n){
    for (auto node: graph[x]){
        if (node == p) continue;
        if (!vis[node] && subtree[node]*2 > n) return find_centroid(node, x, n);
    }
    return x;
}
vector<int> curr;
vector<int> o;
vector<int> depth;
int dp1(int x, int p = -1, int e = 0){
	if (vis[x]) return 0;
	o[x] = e;
	curr.pb(x);
	subtree1[x] = 1;
	for (auto node: graph[x]){
		if (node == p) continue;
		subtree1[x] += dp1(node, x, e);
		depth[node] = depth[x]+1;
	}
	return subtree1[x];
}
vector<int> answer;
void init_centroid(int x = 1, int p = -1){
    dp(x);
    int c = find_centroid(x, -1, subtree[x]);
    // cout << c << endl;
    vector<int> candidates;
    for (auto item: graph[c]){
    	if (!vis[item]) candidates.pb(item);
    }
    for (auto d: candidates){
        depth[d] = 1;
    	dp1(d, c, d);
    }
    vector<vector<int>> opt;
    for (auto item: curr){
    	opt.pb({subtree1[item], depth[item], o[item]});
    // 	if (c == 2){
    // 		cout << item << " " << subtree1[item] << depth[item] << o[item] << endl;
    // 	}
    }
    sort(all(opt));
    reverse(all(opt));
    map<int, int> e;
   	multiset<int, greater<int>> k;
   	for (auto item: candidates){
   		e[item] = 0;
   		k.insert(0);
   	}
   	k.insert(0);
   	k.insert(0);
   	for (auto op: opt){
   		k.erase(k.find(e[op[2]]));
   		e[op[2]] = max(e[op[2]], op[1]);
   		k.insert(e[op[2]]);
   		auto t = k.begin();
   		int s = *t;
   		t++;
   		s += *t;
   		answer[2*op[0]] = max(answer[2*op[0]], s+1ll);
   	}
    for (auto x: curr){
    	subtree[x] = 0;
    	o[x] = 0;
    	depth[x] = 0;
    }
    e.clear();
    k.clear();
    vis[c] = 1;
    // ctree[c] = p;
 	curr.clear();
    for (int node: graph[c]){
        if (!vis[node]){
            init_centroid(node, c);
        }
    }
}
void solve(){
	int n; cin >> n;
	graph.resize(n+1);
	subtree.resize(n+1);
	subtree1.resize(n+1);
	o.resize(n+1);
	vis.resize(n+1);
	answer.resize(n+5);
	depth.resize(n+1);
	FOR(i,0,n-1){
		int u, v; cin >> u >> v;
		graph[u].pb(v);
		graph[v].pb(u);
	}
	init_centroid(1);
	for (int i = 1; i <= n; ++i){
	    if (i%2 == 1) cout << 1 << endl;
	    else{
	        cout << answer[i] << endl;
	    }
	}
}
int32_t main(){
	ios::sync_with_stdio(false);cin.tie(nullptr);
	int t = 1; // cin >> t;
	while (t--) solve();
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |