#include <iostream>
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn = 2*1e5+5, INF = 4e18+9;
template <class T>
struct Fenwick {
int n, log;
vector<T> bit;
Fenwick(int n) : n(n), log(32 - __builtin_clz(n + 1)), bit(n + 1, 0) {}
void add(int i, T delta) {
for (; i <= n; i += i & -i) {
bit[i] = max(bit[i], delta);
}
}
T sum(int i) {
T res = 0;
for (; i > 0; i -= i & -i) {
res = max(res, bit[i]);
}
return res;
}
};
vector<int> res;
struct CentroidTree{
int n;
vector<int> pa;
CentroidTree(int n, vector<vector<int>> &adj) : n(n){
pa.resize(n+1, -1);
vector<bool> ban(n+1, false);
vector<int> sub(n+1), sub2(n+1);
int tree_size;
auto rt = [&](auto rt, int u, int p) -> void{
sub[u] = 1;
for(int v : adj[u]){
if(v == p || ban[v]) continue;
rt(rt, v, u);
sub[u]+=sub[v];
}
};
auto find = [&](auto find, int u, int p) -> int{
for(int v : adj[u]){
if(v == p || ban[v]) continue;
if(sub[v]*2 > tree_size){
return find(find, v, u);
}
}
return u;
};
auto build = [&](auto build, int u, int p) -> void{
rt(rt, u, u);
tree_size = sub[u];
int c = find(find, u, u);
ban[c] = true;
pa[c] = p;
Fenwick<int> bit(tree_size);
vector<pair<int, int>> to_del, vv;
auto dfs = [&](auto dfs, int u, int p, int len) -> void{
sub2[u] = 1;
for(int v : adj[u]){
if(v == p || ban[v]) continue;
dfs(dfs, v, u, len+1);
sub2[u] += sub2[v];
}
vv.push_back({tree_size+1 - sub2[u], len});
int mx = bit.sum(tree_size+1 - sub2[u]);
if(mx > 0) res[sub2[u]*2] = max(res[sub2[u]*2], mx+len+1);
};
for(int v : adj[c]){
if(ban[v]) continue;
vv.clear();
dfs(dfs, v, c, 1);
int szA = tree_size - sub2[v];
for(auto it : vv){
bit.add(it.first, it.second);
int sz = tree_size+1 - it.first;
int mn = min(sz, szA);
res[mn*2] = max(res[mn*2], it.second+1);
}
}
for(int i = 1; i <= tree_size; i++){
bit.bit[i] = 0;
}
for(int i = adj[c].size()-1; i >= 0; i--){
int v = adj[c][i];
if(ban[v]) continue;
vv.clear();
dfs(dfs, v, c, 1);
for(auto it : vv){
bit.add(it.first, it.second);
}
}
for(int v : adj[c]){
if(ban[v]) continue;
build(build, v, c);
}
};
build(build, 1, 0);
};
};
void solve(){
int n;
cin >> n;
vector<vector<int>> adj(n+1);
for(int i = 1; i < n; i++){
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
res.resize(n+1, 0);
CentroidTree(n, adj);
vector<int> ans(n+1);
int mx = 1;
for(int i = n; i >= 1; i--){
mx = max(mx, res[i]);
if(i&1){
ans[i] = 1;
continue;
}
ans[i] = mx;
}
for(int i = 1; i <= n; i++){
cout << ans[i] << "\n";
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
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... |