Submission #567493

#TimeUsernameProblemLanguageResultExecution timeMemory
567493StickfishSwapping Cities (APIO20_swap)C++17
0 / 100
3 ms4948 KiB
#include "swap.h" #include <vector> #include <algorithm> using namespace std; const int MAXN = 1e5 + 123; vector<pair<int, int>> edg[MAXN]; vector<pair<int, int>> edg_mst[MAXN]; int depth[MAXN]; int timer = 0; int tin[MAXN]; int tout[MAXN]; pair<int, int> rt[MAXN]; pair<int, int> crt[MAXN]; void dfs(int v) { tin[v] = timer++; int rtv = rt[v].first; int crtrtv = crt[rtv].first; int crtcrtrtv = crt[crtrtv].first; if (depth[rtv] - depth[crtrtv] == depth[crtrtv] - depth[crtcrtrtv]) { crt[v] = {crtcrtrtv, max({rt[v].second, crt[rtv].second, crt[crtrtv].second})}; } for (auto [u, w] : edg_mst[v]) { if (u == rt[v].first) continue; rt[u] = {v, w}; depth[u] = depth[v] + 1; } tout[v] = timer; } struct dsu { void resize(int n) { par.resize(n); sz.assign(n, 1); for (int i = 0; i < n; ++i) par[i] = i; } int gst(int i) { if (par[i] == i) return i; return par[i] = gst(par[i]); } bool unite(int i, int j) { i = gst(i); j = gst(j); if (i == j) return false; if (sz[i] < sz[j]) swap(i, j); par[j] = i; sz[i] += sz[j]; return true; } private: vector<int> par; vector<int> sz; }; pair<int, pair<int, int>> lca(int v, int u) { pair<int, int> ans; bool swp = 0; if (depth[u] > depth[v]) { swap(u, v); swp = 1; } while (depth[v] > depth[u]) { if (depth[crt[v].first] >= depth[u]) { ans.first = max(ans.first, crt[v].second); v = crt[v].first; } else { ans.first = max(ans.first, rt[v].second); v = rt[v].first; } } while (v != u) { if (crt[v].first == crt[u].first) { ans.first = max(ans.first, rt[v].second); v = rt[v].first; ans.second = max(ans.second, rt[u].second); u = rt[u].first; } else { ans.first = max(ans.first, crt[v].second); v = crt[v].first; ans.second = max(ans.second, crt[u].second); u = crt[u].first; } } if (swp) swap(ans.first, ans.second); return {v, ans}; } void init(int n, int m, vector<int> U, vector<int> V, vector<int> W) { vector<pair<int, pair<int, int>>> edg_weight(m); for (int i = 0; i < m; ++i) { edg_weight[i] = {W[i], {U[i], V[i]}}; } sort(edg_weight.begin(), edg_weight.end()); dsu su; su.resize(n); for (auto [w, e] : edg_weight) { auto [u, v] = e; if (su.unite(u, v)) { edg_mst[u].push_back({v, w}); edg_mst[v].push_back({u, w}); } } dfs(0); } int getMinimumFuelCapacity(int X, int Y) { auto la = lca(X, Y); return max(la.second.first, la.second.second); }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...