Submission #1216489

#TimeUsernameProblemLanguageResultExecution timeMemory
1216489PenguinsAreCuteMeetings 2 (JOI21_meetings2)C++17
100 / 100
168 ms31332 KiB
#include <bits/stdc++.h>
using namespace std;
int main() {
	int n;
	cin >> n;
	vector<vector<int>> adj(n);
	vector<int> ans(n+1,1);
	for(int i=1;i<n;++i) {
		int u, v;
		cin >> u >> v;
		adj[u-1].push_back(v-1);
		adj[v-1].push_back(u-1);
	}
	vector<int> sub(n), lazy(n);
	vector<vector<int>> deep(n);
	auto dfs0 = [&adj,&sub](auto &self, int x, int p) -> int {
		sub[x] = 1;
		for(auto i: adj[x])
			if(i != p)
				sub[x] += self(self, i, x);
		return sub[x];
	};
	auto dfs1 = [&adj,&sub](auto &self, int x, int p, int n) -> int {
		for(auto i: adj[x])
			if(i != p && sub[i] > n / 2)
				return self(self, i, x, n);
		return x;
	};
	auto dfs2 = [&adj,&sub,&lazy,&ans,&deep](auto &self, int x, int p) -> int {
		sub[x] = 1;
		for(auto i: adj[x])
			if(i != p) {
				sub[x] += self(self, i, x);
				if(deep[i].size() > deep[x].size()) {
					swap(deep[i], deep[x]);
					swap(lazy[i], lazy[x]);
				}
				for(int j=0;j<int(deep[i].size());j++)
					ans[2*j] = max(ans[2*j], deep[i][j] + deep[x][j] + lazy[i] + lazy[x] + 3);
				for(int j=0;j<int(deep[i].size());j++)
					deep[x][j] = max(deep[x][j], deep[i][j] + lazy[i] - lazy[x]);
			}
		lazy[x]++;
		deep[x].resize(sub[x] + 1, -lazy[x]);
		return sub[x];
	};
	auto dfs3 = [&adj,&sub,&ans](auto &self, int x, int p, int h, int st) -> void {
		ans[2*sub[x]] = max(ans[2*sub[x]],h+1);
		ans[2*min(sub[x],st)] = max(ans[2*sub[x]],h+2);
		for(auto i: adj[x])
			if(i != p)
				self(self,i,x,h+1,st);
	};
	int cent = dfs1(dfs1, 0, -1, dfs0(dfs0, 0, -1));
	dfs2(dfs2, cent, -1);
	for(auto i: adj[cent])
		dfs3(dfs3,i,cent,0,n-sub[i]);
	for(int i=n-1;i--;)
		ans[i] = max(ans[i], ans[i+2]);
	for(int i=1;i<=n;i++)
		cout << ans[i] << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...