Submission #1282080

#TimeUsernameProblemLanguageResultExecution timeMemory
1282080AksLolCodingThe Ties That Guide Us (CEOI23_incursion)C++17
100 / 100
174 ms7524 KiB
#include <bits/stdc++.h> using namespace std; #include "incursion.h" int n; vector<int> adj[45010]; vector<int> cen; int siz[45010]; int par[45010]; void f(int x, int p) { bool ok = 1; siz[x] = 1; for (int y : adj[x]) { if (y == p) continue; f(y, x); siz[x] += siz[y]; if (siz[y] > n / 2) ok = 0; } if (n - siz[x] > n / 2) ok = 0; if (ok) cen.push_back(x); } void g(int x, int p) { par[x] = p; siz[x] = 1; for (int y : adj[x]) { if (y == p) continue; g(y, x); siz[x] += siz[y]; } } void init(vector<pair<int, int>>& F) { n = (int)F.size() + 1; for (auto [x, y] : F) { adj[x].push_back(y); adj[y].push_back(x); } f(1, -1); if ((int)cen.size() == 1) cen.push_back(-1); assert((int)cen.size() == 2); g(cen[0], cen[1]); if (cen[1] != -1) g(cen[1], cen[0]); } vector<int> mark(vector<pair<int, int>> F, int safe) { init(F); vector<int> res(n); int x = safe; while (1) { res[x - 1] = 1; if (x == cen[0] || x == cen[1]) break; x = par[x]; } return res; } void locate(vector<pair<int, int>> F, int curr, int t) { init(F); int x = curr; while (t == 0) { t = visit(par[x]); x = par[x]; } while (1) { vector<pair<int, int>> nx; for (int y : adj[x]) { if (y == par[x]) continue; nx.push_back({siz[y], y}); } sort(nx.rbegin(), nx.rend()); bool ok = 1; for (auto [_, y] : nx) { if (visit(y)) { ok = 0; x = y; break; } visit(x); } if (ok) 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...