#include<bits/stdc++.h>
#define taskname "C"
using namespace std;
const int lim = 2e5 + 5;
const int INF = 1e9;
template<class T>bool minimize(T& a, T b){
if(a > b){
a = b;
return true;
}
return false;
}
template<class T>void maximize(T& a, T b){
if(a < b){
a = b;
}
}
int n;
namespace sub1{
void solve(){
vector<vector<int>>g(n);
for(int i = 1; i < n; i++){
int u, v;
cin >> u >> v;
g[--u].emplace_back(--v);
g[v].emplace_back(u);
}
vector<vector<int>>d(n, vector<int>(n, -1));
for(int i = 0; i < n; i++){
queue<int>q;
q.push(i);
d[i][i] = 0;
while(!q.empty()){
int u = q.front();
q.pop();
for(int& v : g[u]){
if(d[i][v] == -1){
d[i][v] = d[i][u] + 1;
q.push(v);
}
}
}
}
vector<int>ans(n + 1, 0);
for(int mask = (1 << n) - 1; mask > 0; mask--){
vector<int>p;
for(int i = 0; i < n; i++){
if(1 << i & mask){
p.emplace_back(i);
}
}
int cnt = 0, opt = INF;
for(int i = 0; i < n; i++){
int distance = 0;
for(int& j : p){
distance += d[i][j];
}
if(minimize(opt, distance)){
cnt = 0;
}
if(opt == distance){
cnt++;
}
}
maximize(ans[p.size()], cnt);
}
for(int i = 1; i <= n; i++){
cout << ans[i] << "\n";
}
}
}
namespace sub2{
void solve(){
vector<vector<int>>g(n + 1);
for(int i = 1; i < n; i++){
int u, v;
cin >> u >> v;
g[u].emplace_back(v);
g[v].emplace_back(u);
}
vector<int>ans(n + 1, 1), cnt_child(n + 1, 1), h(n + 1);
vector<vector<int>>up(n + 1, vector<int>(12, 0));
function<void(int)>dfs;
dfs = [&] (int s){
for(int& d : g[s]){
if(d != up[s][0]){
h[d] = h[up[d][0] = s] + 1;
for(int i = 1; i < 12; i++){
up[d][i] = up[up[d][i - 1]][i - 1];
}
dfs(d);
cnt_child[s] += cnt_child[d];
}
}
};
dfs(h[1] = 1);
auto lca = [&] (int u, int v){
for(int k = h[u] - h[v], i = 0; i < 12; i++){
if(1 << i & k){
u = up[u][i];
}
}
if(u == v){
return u;
}
for(int i = 11; i > -1; i--){
if(up[u][i] != up[v][i]){
u = up[u][i];
v = up[v][i];
}
}
return u;
};
for(int i = 1; i <= n; i++){
for(int j = i + 1; j <= n; j++){
int u = i, v = j;
if(h[u] < h[v]){
swap(u, v);
}
int z = lca(u, v);
if(z == v){
int cnt = cnt_child[u], H = h[u];
for(int t = 0, k = h[u] - h[v] - 1; t < 12; t++){
if(1 << t & k){
u = up[u][t];
}
}
maximize(ans[min(cnt, n - cnt_child[u]) << 1], H - h[v] + 1);
continue;
}
maximize(ans[min(cnt_child[u], cnt_child[v]) << 1], h[u] + h[v] - (h[z] << 1) + 1);
}
}
for(int i = n - (n & 1) - 2; i > 0; i--){
maximize(ans[i], ans[i + 2]);
}
for(int i = 1; i <= n; i++){
cout << ans[i] << "\n";
}
}
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
if(fopen(taskname".inp", "r")){
freopen(taskname".inp", "r", stdin);
}
cin >> n;
if(n <= 16){
sub2::solve();
}
else if(n <= 4000){
sub2::solve();
}
}
Compilation message (stderr)
meetings2.cpp: In function 'int main()':
meetings2.cpp:145:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
145 | freopen(taskname".inp", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |