Submission #965018

#TimeUsernameProblemLanguageResultExecution timeMemory
965018PanndaSwapping Cities (APIO20_swap)C++17
17 / 100
2090 ms524288 KiB
#include "swap.h" #include <bits/stdc++.h> using namespace std; struct DSU { vector<int> f; vector<int> siz; vector<int> deg; vector<int> ok; vector<vector<pair<int*, int>>> stk; DSU(int n) : f(n), siz(n, 1), deg(n, 0), ok(n, false) { iota(f.begin(), f.end(), 0); } int leader(int u) { while (u != f[u]) u = f[u]; return u; } bool unionize(int u0, int v0) { stk.emplace_back(); int u = leader(u0); int v = leader(v0); if (u == v) { stk.back().push_back({&ok[u], ok[u]}); ok[u] = true; return false; } if (siz[u] > siz[v]) swap(u, v); stk.back().push_back({&siz[v], siz[v]}); siz[v] += siz[u]; stk.back().push_back({&deg[u0], deg[u0]}); deg[u0]++; stk.back().push_back({&deg[v0], deg[v0]}); deg[v0]++; stk.back().push_back({&ok[v], ok[v]}); if (deg[u0] >= 3 || deg[v0] >= 3) ok[v] = true; ok[v] = ok[v] | ok[u]; stk.back().push_back({&f[u], f[u]}); f[u] = v; return true; } bool same(int u, int v) { return leader(u) == leader(v); } bool isOk(int u) { return ok[leader(u)]; } void rollback() { for (auto [ptr, val] : stk.back()) { *ptr = val; } stk.pop_back(); } }; int n, m; vector<array<int, 3>> edges; const int B = 1600; vector<DSU> dsus; int b; void init(int N, int M, vector<int> U, vector<int> V, vector<int> W) { n = N; m = M; edges.resize(m); for (int i = 0; i < m; i++) { edges[i] = {U[i], V[i], W[i]}; } sort(edges.begin(), edges.end(), [&](array<int, 3> e0, array<int, 3> e1) { return e0[2] < e1[2]; }); dsus.emplace_back(n); for (b = 0; B * b < m; b++) { dsus.push_back(dsus.back()); for (int i = B * b; i < min(m, B * b + B); i++) { dsus.back().unionize(edges[i][0], edges[i][1]); } } b++; } int getMinimumFuelCapacity(int X, int Y) { if (!dsus.back().same(X, Y) || !dsus.back().isOk(X)) return -1; for (int b0 = 0; ; b0++) { if (dsus[b0 + 1].same(X, Y) && dsus[b0 + 1].isOk(X)) { int cnt = 0; int res; for (int i = B * b0; ; i++) { dsus[b0].unionize(edges[i][0], edges[i][1]); cnt++; if (dsus[b0].same(X, Y) && dsus[b0].isOk(X)) { res = edges[i][2]; break; } } while (cnt--) dsus[b0].rollback(); return res; } } }
#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...