Submission #1153223

#TimeUsernameProblemLanguageResultExecution timeMemory
1153223IssaDrawing (CEOI22_drawing)C++20
30 / 100
1595 ms17548 KiB
// #include <bits/stdc++.h>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
#define ent "\n"

const int maxn = 5e5 + 100;
const ll INF = (ll)4e18 + 100;
const int inf = 1e9 + 100;
const ll MOD = 998244353;
const int maxl = 20;
const ll P = 31;

int n;
vector<int> g[maxn];
int used[maxn];
int x[maxn];
int y[maxn];
int f[maxn];
int p[maxn];

bool ok(pair<bool, pll> a, pair<bool, pll> b){
	if(a.first < b.first) return 0;
	if(a.first > b.first) return 1;
	if(a.second.first * b.second.second > b.second.first * a.second.second) return 1;
	return 0;
}

pair<bool, pll> get(int i, int j, bool c){
	if(c){
		if(x[j] >= x[i]){
			return {0, {y[j] - y[i], x[j] - x[i]}};
		} else{
			return {1, {y[j] - y[i], x[j] - x[i]}};
		}
	} else{
		if(x[j] <= x[i]){
			return {0, {y[j] - y[i], x[j] - x[i]}};
		} else{
			return {1, {y[j] - y[i], x[j] - x[i]}};
		}
	}
}

void dfs(int v, int p){
	used[f[v]] = 1;	
	for(int to: g[v]){
		if(to == p) continue;
		bool c = pii{x[f[p]], y[f[p]]} < pii{x[f[v]], y[f[v]]};
		for(int i = 1; i <= n; i++){
			if(used[i]) continue;
			if(!f[to] || ok(get(f[v], f[to], c), get(f[v], i, c))){
				f[to] = i;
			}
		}
		dfs(to, v);
	}
}

void test(){
	cin >> n;
	for(int i = 1; i < n; i++){
		int a, b;
		cin >> a >> b;
		g[a].push_back(b);
		g[b].push_back(a);
	}
	int mx = 0;
	for(int i = 1; i <= n; i++){
		cin >> x[i] >> y[i];
		if(!mx || pii{y[mx], x[mx]} < pii{y[i], x[i]}) mx = i;
	}
	x[0] = inf; y[0] = y[mx];
	f[1] = mx;
	dfs(1, 0);
	for(int i = 1; i <= n; i++){
		p[f[i]] = i;
	} for(int i = 1; i <= n; i++){
		cout << p[i] << ' ';
	} cout << ent;
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int t = 1; 
    while(t--) test();
    cout << ent;
}
#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...