#include <bits/stdc++.h>
#define int long long
using namespace std;
const int nmax = 2e5;
struct point
{
    int x, y, poz;
};
int n;
vector<int> G[nmax + 5];
int w[nmax + 5];
int st[nmax + 5], dr[nmax + 5];
int rez[nmax + 5];
point v[nmax + 5];
point aux[nmax + 5];
int poz = 0;
void get_sons(int nod, int dad = 0)
{
    w[nod] = 1;
    for(auto it : G[nod])
    {
        if(it == dad)
        {
            continue;
        }
        if(!st[nod])
        {
            st[nod] = it;
        }
        else
        {
            dr[nod] = it;
        }
        get_sons(it, nod);
        w[nod] += w[it];
    }
}
void dfs(int nod, point r, int cnt)
{
    rez[r.poz] = nod;
    if(!st[nod])
    {
        return;
    }
    sort(v + 1, v + cnt + 1, [r](point a, point b)
    {
        int d = (1LL * a.x * r.y + 1LL * r.x * b.y + 1LL * b.x * a.y) - (1LL * a.y * r.x + 1LL * r.y * b.x + 1LL * b.y * a.x);
        return (d < 0);
    });
    if(!dr[nod])
    {
        point r_st = v[cnt];
        dfs(st[nod], r_st, cnt - 1);
    }
    else
    {
        point r_st = v[w[st[nod]]];
        point r_dr = v[w[st[nod]] + 1];
        dfs(st[nod], r_st, w[st[nod]] - 1);
        int nr = 0;
        for(int i=w[st[nod]]+2; i<=cnt; i++)
        {
            aux[++nr] = v[i];
        }
        aux[++nr] = v[w[st[nod]] + 1];
        aux[++nr] = v[w[st[nod]]];
        for(int i=1; i<w[st[nod]]; i++)
        {
            aux[++nr] = v[i];
        }
        for(int i=1; i<=cnt; i++)
        {
            v[i] = aux[i];
        }
        dfs(dr[nod], r_dr, w[dr[nod]] - 1);
    }
}
void dfs2(int nod)
{
    ++poz;
    rez[v[poz].poz] = nod;
    if(st[nod])
    {
        dfs2(st[nod]);
    }
    if(dr[nod])
    {
        dfs2(dr[nod]);
    }
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
#ifdef home
    freopen("nr.in","r",stdin);
    freopen("nr.out","w",stdout);
#endif // home
    cin>>n;
    for(int i=1; i<n; i++)
    {
        int x, y;
        cin>>x>>y;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    point r = point{0, -1, 0};
    for(int i=1; i<=n; i++)
    {
        point p;
        cin>>p.x>>p.y;
        p.poz = i;
        v[i] = p;
        if(p.y > r.y)
        {
            r = p;
        }
    }
    int nr = 0;
    for(int i=1; i<=n; i++)
    {
        if(v[i].poz == r.poz)
        {
            continue;
        }
        aux[++nr] = v[i];
    }
    for(int i=1; i<n; i++)
    {
        v[i] = aux[i];
    }
    int root = 0;
    for(int i=1; i<=n; i++)
    {
        if(G[i].size() != 3)
        {
            root = i;
            break;
        }
    }
    if(false)
    {
        get_sons(root);
        dfs(root, r, n - 1);
    }
    else
    {
        sort(v + 1, v + n, [r](point a, point b)
        {
            int d = (1LL * a.x * r.y + 1LL * r.x * b.y + 1LL * b.x * a.y) - (1LL * a.y * r.x + 1LL * r.y * b.x + 1LL * b.y * a.x);
            return (d < 0);
        });
        for(int i=n; i>=2; i--)
        {
            v[i] = v[i - 1];
        }
        v[1] = r;
        get_sons(root);
        dfs2(root);
    }
    for(int i=1; i<=n; i++)
    {
        cout<<rez[i]<<' ';
    }
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |