#include #include #include #include #include #define ST first #define ND second #define FOR(i, b, e) for(int i = b; i <= e; i++) #define FORD(i, b, e) for(int i = b; i >= e; i--) #define PB push_back #define SIZE(x) ((int)x.size()) using namespace std; int n; const int maxn = 1042; typedef long long ll; typedef pair pll; map printer; ll det(pll a, pll b, pll c) { return (a.ST * b.ND + b.ST * c.ND + c.ST * a.ND - a.ST * c.ND - b.ST * a.ND - c.ST * b.ND); } pll basepoint; bool cmp(const pll &a, const pll &b) { return det(basepoint, a, b) > 0; } vector gr[maxn]; int dp[maxn]; void dfs(int a, int o) { dp[a] = 1; for(auto i : gr[a]) if(i != o) { dfs(i, a); dp[a] += dp[i]; } } /* bool intersects(segment seg1, segment seg2) { ll Ax = x[seg1.id1]; ll Ay = y[seg1.id1]; ll Bx = x[seg1.id2]; ll By = y[seg1.id2]; ll Cx = x[seg2.id1]; ll Cy = y[seg2.id1]; ll Dx = x[seg2.id2]; ll Dy = y[seg2.id2]; pll a, b, c, d; a = {Ax, Ay}; b = {Bx, By}; c = {Cx, Cy}; d = {Dx, Dy}; if(sgn(det(a, b, c)) * sgn(det(a, b, d)) < 0 && sgn(det(c, d, a))*sgn(det(c, d, b)) < 0) return true; return false; } */ pll make_tree(int a, int o, vector &v) { //~ cout << "***" << a << ' ' << o << ' ' << SIZE(v) << endl; //~ for(auto i : v) //~ cout << i.ST << ' ' << i.ND << "; "; //~ cout << endl; if((int)v.size() > 1) { int bestp = 0; FOR(i, 0, SIZE(v) - 1) { if(v[i] < v[bestp]) bestp = i; } swap(v[0], v[bestp]); basepoint = v[0]; sort(v.begin() + 1, v.end(), cmp); //~ for(auto i : v) //~ cout << i.ST << ' ' << i.ND << "; "; //~ cout << endl; int ni = 1; for(auto i : gr[a]) if(i != o) { vector v2; v2.clear(); //~ cout << endl; //~ cout << "put " << dp[i] << endl; FOR(j, 1, dp[i]) { v2.PB(v[ni++]); //cout << "x " << v[ni - 1].ST << ' ' << v[ni - 1].ND << endl; } //~ cout << "puted " << SIZE(v2) << endl; //cout << "WTF" << endl; pll rett = make_tree(i, a, v2); //~ cout << "ans :" << endl; cout << printer[v[0]] << ' ' << printer[rett] << '\n'; //~ cout << v[0].ST << ' ' << v[0].ND << ' ' << rett.ST << ' ' << rett.ND << endl; } } return v[0]; } int main() { ios_base::sync_with_stdio(false); cin >> n; FOR(i, 1, n - 1) { int a, b; cin >> a >> b; a++; b++; gr[a].PB(b); gr[b].PB(a); } vector v; FOR(i, 0, n - 1) { ll x, y; cin >> x >> y; printer[{x, y}] = i; v.PB({x, y}); } dfs(1, -1); //~ FOR(i, 1, n) //~ cout << dp[i] << ' '; //~ cout << endl; make_tree(1, -1, v); /* vector segments; for (int i=0; i