Submission #1249110

#TimeUsernameProblemLanguageResultExecution timeMemory
1249110kamradMeetings 2 (JOI21_meetings2)C++20
100 / 100
354 ms25236 KiB
#include <bits/stdc++.h>
using namespace std;

//#pragma GCC optimize("Ofast,unroll-loops")
//#pragma GCC target("avx2,popcnt,lzcnt,abm,bmi,bmi2,fma,tune=native")

using ll  = long long;
using ld  = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using pi3 = pair<pii, int>;

#define IOS               ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define F                 first
#define S                 second
#define sz(x)             x.size()
#define all(x)            x.begin(), x.end()
#define pb                push_back
#define cl                clear
#define minr(a, b)        a = min(a, b);
#define maxr(a, b)        a = max(a, b);
#define shit              cout << "shit\n" << flush;
#define tl                while(1&1) continue;
#define FOR(i, st, nd)    for(int i = st; i <= nd; i++)
#define rand(l, r)        uniform_int_distribution<int64_t>(l,r)(rng)
random_device device;     default_random_engine rng(device());

const int Mod    = 1e9 + 7; //998244353;
const int LG     = 64;
const int SQ     = 500;
const int Inf    = 2e9 + 10;
const int maxN   = 2e5 + 10;

int n;
int a[maxN];
int b[maxN];
int ans[maxN];
int sts[maxN];

bool mark[maxN];

vector <int> neighb[maxN];

void cent(int u, int p, int CurSz, int &c) {
	sts[u] = 1;
	for(auto v : neighb[u]) {
		if(v == p or mark[v])
			continue;
		cent(v, u, CurSz, c);
		sts[u] += sts[v];
	}

	bool check = false;
	if(sts[u] >= (CurSz+1)/2) {
		check = true;
		for(auto v : neighb[u]) {
			if(v == p or mark[v])
				continue;

			if(sts[v] > CurSz/2) {
				check = false;
				break;
			}
		}
	}
	if(check)
		c = u;
}

void calc(int u, int p, int h) {
	a[sts[u]] = max(h, a[sts[u]]);
	for(auto v : neighb[u]) {
		if(v != p and !mark[v]) {
			calc(v, u, h+1);
		}
	}
}

void solve(int u, int CurSz) {
	if(CurSz == 1) {
		return;
	}

	int c;
	int tmp;
	cent(u, u, CurSz, c);
	cent(c, c, CurSz, tmp);
	c = u;
	c = tmp;

	mark[c] = true;

	for(int i = 1; i <= CurSz; i++)
		b[i] = 0;
	for(auto v : neighb[c]) {
		if(!mark[v]) {
			for(int i = 1; i <= sts[v]; i++)
				a[i] = 0;
			calc(v, c, 1);

			for(int i = sts[v]-1; i >= 1; i--)
				maxr(a[i], a[i+1]);

			for(int i = 1; i <= sts[v]; i++) {
				maxr(ans[i], a[i]+b[i]+1);
				maxr(b[i], a[i]);
			}	
		}
	}
	for(auto v : neighb[c])
		if(!mark[v])
			solve(v, sts[v]);
}

int main() {
	IOS;

	cin >> n;
	for(int i = 1; i < n; i++) {
		int u, v;
		cin >> u >> v;
		neighb[u].pb(v);
		neighb[v].pb(u);
	}

	solve(1, n);
	for(int i = 1; i <= n; i++) {
		if(i%2)
			cout << 1 << "\n";
		else
			cout << max(ans[i/2], 1) << "\n";
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...