제출 #976584

#제출 시각아이디문제언어결과실행 시간메모리
976584happy_nodeMeetings 2 (JOI21_meetings2)C++17
100 / 100
575 ms32084 KiB
#include <bits/stdc++.h>
using namespace std;

const int MX=2e5+5;
int N;
vector<int> adj[MX];

bool used[MX];
int sz[MX]; 

int f[MX];
vector<pair<int,int>> mxs[MX];

int getSize(int v, int p) {
	sz[v]=1;
	for(auto u:adj[v]) {
		if(u==p || used[u]) continue;
		sz[v]+=getSize(u,v);
	}
	return sz[v];
}

int getCen(int v, int p, int s) {
	for(auto u:adj[v]) {
		if(u==p || used[u]) continue;
		if(2*sz[u]>s) return getCen(u,v,s);
	}
	return v;
}

int head=0,s=0;
int ans[MX];

void dfs(int v, int p, int dep) {
	f[sz[v]]=max(f[sz[v]],dep);

	int i=min(sz[v],s-sz[head]);
	ans[2*i]=max(ans[2*i],dep+1);

	for(auto u:adj[v]) {
		if(u==p || used[u]) continue;
		dfs(u,v,dep+1);
	}
}

void cdc(int v) {
	s=getSize(v,v);
	int cen=getCen(v,v,s);
	used[cen]=true;
	getSize(cen,cen);

	for(auto u:adj[cen]) {
		if(!used[u]) {
			head=u;
			dfs(u,cen,1);

			for(int i=1;i<=sz[u];i++) {
				mxs[i].push_back({f[i],u});
				sort(mxs[i].rbegin(),mxs[i].rend());
				while(mxs[i].size()>2) mxs[i].pop_back();
				f[i]=0;
			}
		}
	}

	vector<pair<int,int>> vv;

	for(int i=s;i>=1;i--) {
		vector<pair<int,int>> nv;
		for(auto [fi,u]:mxs[i]) {
			vv.push_back({fi,u});
		}
		sort(vv.rbegin(),vv.rend());
		for(auto [fi,u]:vv) {
			if(nv.empty()) {
				nv.push_back({fi,u});
				continue;
			}
			if(nv.size()==1) {
				if(nv.back().second!=u) nv.push_back({fi,u});
				continue;
			}
			break;
		}
		swap(vv,nv);
		if(vv.size()>1) {
			ans[2*i]=max(ans[2*i],vv[0].first+vv[1].first+1);
		}
	}

	for(int i=1;i<=sz[cen];i++) {
		mxs[i].clear();
	}

	for(auto u:adj[cen]) {
		if(!used[u]) {
			cdc(u);
		}
	}
}

int main() {
	cin.tie(0); ios_base::sync_with_stdio(0);

	cin>>N;
	for(int i=1;i<N;i++) {
		int u,v;
		cin>>u>>v;
		adj[u].push_back(v);
		adj[v].push_back(u);
	}

	cdc(1);

	ans[N+1]=1;
	for(int i=N;i>=1;i--) 
		ans[i]=max(ans[i],ans[i+1]);

	for(int i=1;i<=N;i++) {
		if(i&1) {
			cout<<1<<'\n';
		} else {
			cout<<ans[i]<<'\n';
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...