Submission #751124

#TimeUsernameProblemLanguageResultExecution timeMemory
751124drdilyorDrawing (CEOI22_drawing)C++17
100 / 100
663 ms80772 KiB
#pragma GCC optimize("Ofast") #pragma GCC target("avx,avx2,fma") #pragma GCC optimize("unroll-loops") #include<bits/stdc++.h> using namespace std; using ll = long long; const int inf = 1e9; const ll infl = 1e18; mt19937 rng; using pt = pair<int,int>; bool ccw(pt A, pt B, pt C) { return ll(C.second-A.second) * (B.first-A.first) > ll(B.second-A.second) * (C.first-A.first); } bool intersect(pt A, pt B, pt C, pt D) { return ccw(A, C, D) != ccw(B, C, D) && ccw(A, B, C) != ccw(A, B, D); } int main() { int n; cin >> n; vector<vector<int>> adj(n); vector<pair<int,int>> pts(n); for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; u--;v--; adj[u].push_back(v); adj[v].push_back(u); } map<pair<int,int>, int> ix; for (auto& [x, y] : pts) cin >> x >> y; for (int i = 0; i < n; i++) ix[pts[i]]= i; int r = 0; for (; r < n; r++) if (adj[r].size() < 3) break; vector<int> res(n, -1); vector<int> subs(n, 1); auto dfs_sz = [&](auto& dfs_sz, int i, int p=-1)->void { for (int e : adj[i]) if (e != p) { dfs_sz(dfs_sz, e, i); subs[i] += subs[e]; } }; dfs_sz(dfs_sz, r); auto dfs = [&](auto& dfs, vector<pair<int,int>>::iterator p1, vector<pair<int,int>>::iterator p2, int i, int p =-1)->void { vector<int> ch; for (int e : adj[i]) { if (e != p) ch.push_back(e); } if (ch.empty()) { assert(p1 == p2); return; } if (ch.size() == 1) { res[ch[0]] = ix[*p1++]; dfs(dfs, p1, p2, ch[0], i); } else { //sort(p1, p2, [](const auto& p, const auto& q)->bool { return (ll)p.second * q.first > (ll) q.second * p.first; }); assert(p2 - p1 == subs[ch[0]] + subs[ch[1]]); auto q1 = p1 + subs[ch[0]]; auto q2 = p2; p2 = q1; //sort(p1, p2, greater()); //sort(q1, q2, greater()); res[ch[0]] = ix[*p1++]; res[ch[1]] = ix[*q1++]; dfs(dfs, p1, p2, ch[0], i); dfs(dfs, q1, q2, ch[1], i); } }; auto p1 = pts.begin(), p2 = pts.end(); sort(pts.begin(), pts.end()); res[r] = ix[*p1++]; dfs(dfs, p1, p2, r); vector<int> byp(n); for (int i = 0; i < n; i++) assert(res[i] >= 0), byp[res[i]] = i; for (int i : byp) { cout << i+1 << ' '; } 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...