제출 #1361700

#제출 시각아이디문제언어결과실행 시간메모리
1361700Jawad_Akbar_JJMeetings 2 (JOI21_meetings2)C++20
100 / 100
308 ms47264 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
const int N = 1<<18;
vector<int> nei[N];
vector<pair<int, pair<int, int>>> E;
int Par[N][20], ch[N], hei[N], L[N], R[N], pr[N], Ans[N], n;

void dfs(int u, int p){
	Par[u][0] = p;
	ch[u] = 1;
	hei[u] = hei[p] + 1;

	for (int i=0;i<17;i++)
		Par[u][i+1] = Par[Par[u][i]][i];

	for (int i : nei[u]){
		if (i == p)
			continue;
		dfs(i, u);
		ch[u] += ch[i];

		E.push_back({min(ch[i], n - ch[i]), {i, u}});
	}
}

int LCA(int u, int v){
	if (hei[u] > hei[v])
		swap(u, v);

	for (int i=17;i + 1;i--){
		if (hei[u] + (1<<i) <= hei[v])
			v = Par[v][i];
	}

	for (int i=17;i + 1;i--){
		if (Par[u][i] != Par[v][i])
			u = Par[u][i], v = Par[v][i];
	}
	return hei[u] - (u != v);
}

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

int root(int v){
	return (pr[v] == 0 ? v : pr[v] = root(pr[v]));
}

int main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	cin>>n;

	for (int i=1;i<=n;i++)
		L[i] = R[i] = i;

	for (int i=1, a, b;i<n;i++){
		cin>>a>>b;

		nei[a].push_back(b);
		nei[b].push_back(a);
	}

	dfs(1, 0);

	sort(rbegin(E), rend(E));

	for (auto [c, ab] : E){
		int A = root(ab.first), B = root(ab.second), d = 0;
		// cout<<A<<' '<<B<<' '<<endl;
		vector<pair<int, int>> vc = {{L[A], R[A]}, {L[B], R[B]}, {L[A], R[B]}, {R[A], R[B]}, {L[A], L[B]}, {R[A], L[B]}};

		pr[B] = A;
		for (auto [u, v] : vc){
			int x = dist(u, v);
			// cout<<u<<' '<<v<<' '<<x<<endl;
			if (x > d)
				d = x, L[A] = u, R[A] = v;
		}
		Ans[c] = d;
	}

	for (int i=n; i; 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/2] + 1<<'\n';
	}
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…