Submission #742891

#TimeUsernameProblemLanguageResultExecution timeMemory
742891maomao90Drawing (CEOI22_drawing)C++17
100 / 100
324 ms46284 KiB
// Hallelujah, praise the one who set me free // Hallelujah, death has lost its grip on me // You have broken every chain, There's salvation in your name // Jesus Christ, my living hope #include <bits/stdc++.h> using namespace std; #define REP(i, s, e) for (int i = (s); i < (e); i++) #define RREP(i, s, e) for (int i = (s); i >= (e); i--) template <class T> inline bool mnto(T& a, T b) {return a > b ? a = b, 1 : 0;} template <class T> inline bool mxto(T& a, T b) {return a < b ? a = b, 1: 0;} typedef long long ll; typedef long double ld; #define FI first #define SE second typedef pair<int, int> ii; typedef pair<ll, ll> pll; typedef tuple<int, int, int> iii; #define ALL(_a) _a.begin(), _a.end() #define SZ(_a) (int) _a.size() #define pb push_back typedef vector<int> vi; typedef vector<ll> vll; typedef vector<ii> vii; typedef vector<iii> viii; #ifndef DEBUG #define cerr if (0) cerr #endif const int INF = 1000000005; const ll LINF = 1000000000000000005ll; const int MAXN = 200005; struct Point { int x, y, i; bool operator< (const Point &o) const { if (x == o.x) return y < o.y; return x < o.x; } Point& operator+= (const Point &o) { x += o.x; y += o.y; return *this; } Point& operator-= (const Point &o) { x -= o.x; y -= o.y; return *this; } ll cross(const Point& o) { return (ll) x * o.y - (ll) y * o.x; } }; int n; vi adj[MAXN]; Point pt[MAXN]; int ans[MAXN]; vi ch[MAXN]; int sub[MAXN]; void dfs(int u, int p) { sub[u] = 1; for (int v : adj[u]) { if (v == p) { continue; } ch[u].pb(v); dfs(v, u); sub[u] += sub[v]; } } void solve(int u, int l, int r) { ans[pt[l].i] = u; for (int v : ch[u]) { solve(v, l + 1, l + sub[v]); l += sub[v]; } assert(l == r); } int main() { #ifndef DEBUG ios::sync_with_stdio(0), cin.tie(0); #endif cin >> n; REP (i, 1, n) { int u, v; cin >> u >> v; adj[u].pb(v); adj[v].pb(u); } REP (i, 0, n) { cin >> pt[i].x >> pt[i].y; pt[i].i = i; } sort(pt, pt + n); RREP (i, n - 1, 0) { pt[i] -= pt[0]; } sort(pt + 1, pt + n, [&] (Point &l, Point &r) { return l.cross(r) > 0; }); int rt = -1; REP (i, 1, n + 1) { if (SZ(adj[i]) <= 2) { rt = i; break; } } assert(rt != -1); dfs(rt, -1); solve(rt, 0, n - 1); REP (i, 0, n) { cout << ans[i] << ' '; } cout << '\n'; return 0; }
#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...