Submission #419978

#TimeUsernameProblemLanguageResultExecution timeMemory
419978nafis_shifatMeetings 2 (JOI21_meetings2)C++14
100 / 100
439 ms44516 KiB
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
using namespace std;
const int mxn=2e5+5;
const int inf=1e9;

vector<int> adj[mxn];
int sz[mxn];
int parent[20][mxn];
int level[mxn] = {};

int n;

vector<int> con[mxn];


void dfs(int cur,int prev) {
	parent[0][cur] = prev;
	level[cur] = level[prev] + 1;
	sz[cur] = 1;
	for(int u : adj[cur]) {
		if(u == prev) continue;
		dfs(u,cur);
		sz[cur] += sz[u];
	}

	con[sz[cur]].push_back(cur);

}

int getCentroid(int cur,int prev) {
	bool f = (n - sz[cur]) <= n / 2;


	for(int u : adj[cur]) {
		if(u == prev) continue;
		f = f && (sz[u] <= (n  / 2));
	}
	if(f) return cur;


	for(int u : adj[cur]) {
		if(u == prev) continue;
		if(sz[u] > (n / 2)) return getCentroid(u,cur);
	}
	return -1;

}



int getLCA(int u,int v) {
	if(level[u] < level[v]) swap(u,v);

	int dif = level[u] - level[v];
	for(int i = 0; i < 20; i++) {
		if((dif >> i) & 1) u = parent[i][u];
	}

	if(u == v) return u;

	for(int i = 19; i >= 0; i--) {
		if(parent[i][u] != parent[i][v]) {
			u = parent[i][u];
			v = parent[i][v];
		}
	}
	return parent[0][u];
}


int dist(int u,int v) {
	return level[u] + level[v] - 2 * level[getLCA(u,v)];
}

int main() {
	cin >> n;

	for(int i = 1; i < n; i++) {
		int u,v;
		scanf("%d%d",&u,&v);
		adj[u].push_back(v);
		adj[v].push_back(u);
	}

	dfs(1,0);

	int root = getCentroid(1,0);


	for(int i = 0; i <= n; i++) con[i].clear();

	dfs(root,0);





	for(int i = 1; i < 20; i++) {
		for(int j = 1; j <= n; j++) {
			parent[i][j] = parent[i - 1][parent[i - 1][j]];
		}
	}


	int U = root , V = root;

	int res[n + 1];


	for(int i = n; i >= 1; i--) {
		int ans = dist(U,V);
		if(i % 2 == 1) {
			res[i] = 0;
			continue;
		}


		int x = i/2;

		for(int cur : con[x]) {
			int d1 = dist(U,V);
			int d2 = dist(U,cur);
			int d3 = dist(V,cur);

			if(d2 >= max(d1,d3)) {
				V = cur;
			} else if(d3 >= max(d1,d2)) {
				U = cur;
			}
			if(level[U] < level[V]) swap(U,V);
			ans = max(ans,max({d1,d2,d3}));
		}

		res[i] = ans;

		
	}

	for(int i = 1; i <= n; i++) printf("%d\n",res[i] + 1);






	
}

Compilation message (stderr)

meetings2.cpp: In function 'int main()':
meetings2.cpp:82:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   82 |   scanf("%d%d",&u,&v);
      |   ~~~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...