제출 #1328688

#제출 시각아이디문제언어결과실행 시간메모리
1328688PieArmyDrawing (CEOI22_drawing)C++20
100 / 100
172 ms32904 KiB
#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;
#define mid ((left+right)>>1)

int n;
vector<int>komsu[200023];
pair<int,int>arr[200023];
int par[200023],sub[200023];
int ans[200023];

void f(int pos,vector<int>&v){
	for(int i=1;i<komsu[pos].size();i++){
		if(komsu[pos][i-1]==par[pos])swap(komsu[pos][i],komsu[pos][i-1]);
	}
	if(komsu[pos].back()==par[pos])komsu[pos].pop_back();
	if(!komsu[pos].size())return;
	if(komsu[pos].size()==2){
		if(sub[komsu[pos][0]]<sub[komsu[pos][1]]){
			swap(komsu[pos][0],komsu[pos][1]);
		}
		int x=komsu[pos][1];
		vector<int>z;
		for(int i=sub[pos]-1-sub[x];i<sub[pos]-1;i++){
			z.pb(v[i]);
		}
		ans[z.back()]=x;
		z.pop_back();
		f(x,z);
	}
	int x=komsu[pos][0];
	while(v.size()!=sub[x]){
		v.pop_back();
	}
	ans[v.back()]=x;
	v.pop_back();
	f(x,v);
}

void dfs(int pos){
	sub[pos]=1;
	for(int x:komsu[pos]){
		if(x==par[pos])continue;
		par[x]=pos;
		dfs(x);
		sub[pos]+=sub[x];
	}
}

signed main(){
	ios_base::sync_with_stdio(23^23);cin.tie(0);
	cin>>n;
	for(int i=1;i<n;i++){
		int x,y;cin>>x>>y;
		komsu[x].pb(y);
		komsu[y].pb(x);
	}
	int root=1;
	for(int i=1;i<=n;i++){
		cin>>arr[i].fr>>arr[i].sc;
		if(arr[i]<arr[root])root=i;
	}
	int bas=1;
	while(komsu[bas].size()==3)bas++;
	par[bas]=bas;
	dfs(bas);
	vector<int>v;
	for(int i=1;i<=n;i++){
		if(i==root)continue;
		v.pb(i);
	}
	ans[root]=bas;
	sort(v.begin(),v.end(),[&](const int &x,const int &y){
		return arr[x]>arr[y];
	});
	f(bas,v);
	for(int i=1;i<=n;i++){
		cout<<ans[i]<<" ";
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...