제출 #288653

#제출 시각아이디문제언어결과실행 시간메모리
288653Haunted_CppSplit the Attractions (IOI19_split)C++17
0 / 100
83 ms9080 KiB
#include "split.h" #include <bits/stdc++.h> using namespace std; const int MAX_N = 1e5 + 5; bool vis[MAX_N], solved = false; vector<vector<int>> g(MAX_N); vector<int> sub(MAX_N); int calc(int node, int p) { sub[node] = 1; for (auto to : g[node]) { if (to != p) { sub[node] += calc(to, node); } } return sub[node]; } vector<int> ans; int split_point = -1; void paint(int node, int p, int w, int &cnt) { if (cnt) { --cnt; ans[node] = w; } for (auto to : g[node]) { if (to == p) continue; if (to == split_point) continue; paint(to, node, w, cnt); } } int n; vector<pair<int, int>> where; void dfs(int node, int p) { const int cur = sub[node]; const int other = n - cur; bool is_valid = true; for (auto to : g[node]) { if (to == p) continue; is_valid &= (sub[to] < where[0].first); } if (!solved && is_valid && cur >= where[0].first && other >= where[1].first) { solved = true; paint(node, p, where[0].second, where[0].first); split_point = node; paint(0, -1, where[1].second, where[1].first); } for (auto to : g[node]) { if (to != p) { dfs(to, node); } } } vector<int> find_split(int n, int a, int b, int c, vector<int> p, vector<int> q) { ::n = n; where.emplace_back(a, 1); where.emplace_back(b, 2); where.emplace_back(c, 3); sort(where.begin(), where.end()); vector<int> in(n); ans = vector<int>(n, where[2].second); const int m = p.size(); assert(m == n - 1); for (int i = 0; i < m; i++) { int st = p[i]; int et = q[i]; //~ --st; --et; g[st].emplace_back(et); g[et].emplace_back(st); } calc(0, -1); dfs(0, -1); if (!solved) for (auto &to : ans) to = 0; return ans; }
#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...