제출 #1168586

#제출 시각아이디문제언어결과실행 시간메모리
1168586anmattroiThe Ties That Guide Us (CEOI23_incursion)C++17
30 / 100
168 ms17860 KiB
#include "incursion.h" #include <bits/stdc++.h> #define fi first #define se second #define maxn 450005 using namespace std; int n, root, sz[maxn], par[maxn]; vector<int> adj[maxn]; void pfs(int u, int dad) { par[u] = dad; sz[u] = 1; for (int v : adj[u]) if (v != dad) { pfs(v, u); sz[u] += sz[v]; } } int find_centroid(int u, int dad) { for (int v : adj[u]) if (v != dad && sz[v] > n/2) return find_centroid(v, u); return u; } vector<int> mark(vector<pair<int, int>> F, int safe) { n = F.size()+1; for (auto [u, v] : F) { adj[u].emplace_back(v); adj[v].emplace_back(u); } pfs(1, 0); int centroid1 = find_centroid(1, 0); if (n % 2 == 0) { int centroid2 = 0; for (int v : adj[centroid1]) if (v != par[centroid1] && sz[v] == n/2) { centroid2 = v; break; } if (sz[centroid1] == n/2) centroid2 = par[centroid1]; if (centroid2) { if (safe == centroid1 || safe == centroid2) { vector<int> ans(n, 0); ans[safe-1] = 1; return ans; } } } root = find_centroid(1, 0); pfs(root, 0); vector<int> ans(n, 0); while (safe) { ans[safe-1] = 1; safe = par[safe]; } return ans; } map<int, int> cached; void locate(vector<pair<int, int>> F, int curr, int t) { n = F.size()+1; cached.clear(); for (int i = 1; i <= n; i++) adj[i].clear(); for (auto [u, v] : F) { adj[u].emplace_back(v); adj[v].emplace_back(u); } pfs(1, 0); root = find_centroid(1, 0); pfs(root, 0); cached[curr] = t; while (t == 0 && curr != root) { t = visit(curr = par[curr]); cached[curr] = t; } int centroid2 = -1; if (n%2==0) { for (int v : adj[root]) if (sz[v] == n/2) centroid2 = v; } if (root == curr) { for (int v : adj[curr]) { if (cached.count(v)) continue; int orz = visit(v); cached[v] = orz; if (!orz) { visit(root); continue; } curr = v; t = orz; break; } if (curr == root) return; } else if (curr != centroid2) cached[par[curr]] = -1; else { for (int v : adj[curr]) if (v != root && !cached.count(v)) { int orz = visit(v); if (orz) { cached[curr] = -1; cached[v] = orz; curr = orz; break; } visit(curr); cached[v] = -1; } } while (1) { int mxsz = -1, bigChild = -1; for (int v : adj[curr]) if (!cached.count(v)) { if (mxsz < sz[v]) { mxsz = sz[v]; bigChild = v; } } if (mxsz == -1) return; int T = visit(bigChild); cached[bigChild] = T; if (T) { curr = bigChild; continue; } visit(curr); int last = curr; for (int v : adj[curr]) if (!cached.count(v)) { int orz = visit(v); if (!orz) { visit(curr); return; } curr = orz; cached[curr] = orz; break; } if (curr == last) return; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...