답안 #956785

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
956785 2024-04-02T13:05:35 Z LCJLY Meetings 2 (JOI21_meetings2) C++14
0 / 100
3 ms 10332 KB
#include <bits/stdc++.h>
using namespace std;
 
#define int long long 
#define ld long double
#define show(x,y) cout << y << " " << #x << endl;
#define show2(x,y,i,j) cout << y << " " << #x << "  " << j << " " << #i << endl;
#define show3(x,y,i,j,p,q) cout << y << " " << #x << "  " << j << " " << #i << "  " << q << " " << #p << endl;
#define show4(x,y) for(auto it:y) cout << it << " "; cout << #x << endl;
typedef pair<long long,int>pii;
typedef pair<pii,pii>pi2;
mt19937 rng(chrono::system_clock::now().time_since_epoch().count());

vector<int>adj[200005];
int pp[200005];
int d[200005];

void dfs(int index, int par){
	for(auto it:adj[index]){
		if(it==par) continue;
		d[it]=d[index]+1;
		pp[it]=index;
		dfs(it,index);
	}
}

bool visited[200005];
int cnt[200005];
int cnt2[200005];

void dfs2(int index, int take, int type){
	visited[index]=true;
	if(type==1)cnt[take]++;
	else cnt2[take]++;
	for(auto it:adj[index]){
		if(visited[it]) continue;
		dfs2(it,take,type);
	}
}

void solve(){
	int n;
	cin >> n;
	
	int temp,temp2;
	for(int x=0;x<n-1;x++){
		cin >> temp >> temp2;
		adj[temp].push_back(temp2);
		adj[temp2].push_back(temp);
	}
	
	//show(check,1);
	
	dfs(1,-1);
	pii best={-1,-1};
	for(int x=1;x<=n;x++){
		best=max(best,{d[x],x});
	}
	
	memset(d,0,sizeof(d));
	dfs(best.second,-1);
	pii best2={-1,-1};
	for(int x=1;x<=n;x++){
		best2=max(best2,{d[x],x});
	}
	
	//show(check,1);
	
	int cur=best2.second;
	vector<int>path;
	while(1){
		path.push_back(cur);
		visited[cur]=true;
		if(cur==best.second) break;
		cur=pp[cur];
	}

	int half=(int)path.size()/2;
	for(int x=0;x<half;x++){
		dfs2(path[x],x,1);
	}
	
	//show(check,1);
	
	for(int x=(int)path.size()-1;x>=(int)path.size()-half;x--){
		dfs2(path[x],(int)path.size()-1-x,2);
	}
	
	int ptr=0;
	int ptr2=0;
	for(int x=1;x<=n;x++){
		if(x%2==1){
			cout << 1 << "\n";
		}
		else{
			while(ptr<half&&cnt[ptr]==0){
				ptr++;
				//show(loop,1);
			}
			while(ptr2<half&&cnt2[ptr2]==0) ptr2++;
			cnt[ptr]--;
			cnt2[ptr2]--;
			if(cnt[ptr]<0||cnt2[ptr2]<0){
				cout << 1 << "\n";
			}
			else cout << max(1LL,(int)path.size()-ptr-ptr2) << "\n";
			
		}
	}
}
 
int32_t main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	int t=1;
	//freopen("in.txt","w",stdout);
	//cin >> t;
	while(t--){
		solve();
	}
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 8280 KB Output is correct
2 Correct 2 ms 10328 KB Output is correct
3 Correct 2 ms 10332 KB Output is correct
4 Incorrect 3 ms 10288 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 8280 KB Output is correct
2 Correct 2 ms 10328 KB Output is correct
3 Correct 2 ms 10332 KB Output is correct
4 Incorrect 3 ms 10288 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 8280 KB Output is correct
2 Correct 2 ms 10328 KB Output is correct
3 Correct 2 ms 10332 KB Output is correct
4 Incorrect 3 ms 10288 KB Output isn't correct
5 Halted 0 ms 0 KB -