Submission #726749

#TimeUsernameProblemLanguageResultExecution timeMemory
726749SanguineChameleonSwapping Cities (APIO20_swap)C++17
100 / 100
214 ms26752 KiB
#include "swap.h" #include <bits/stdc++.h> using namespace std; const int maxN = 1e5 + 20; const int inf = 1e9 + 20; bool flag[maxN]; vector<pair<int, int>> adj[maxN]; int deg[maxN]; int depth[maxN]; pair<int, int> par[maxN]; int T[maxN]; vector<pair<int, int>> tree; int ROOT; bool sub1, sub2; int N, M, lim; bool f1, f2; int root(int u) { if (par[u].first == -1) { return u; } return root(par[u].first); } void update(int u, int v, int w) { deg[u]++; deg[v]++; sub2 &= (deg[u] <= 2); sub2 &= (deg[v] <= 2); int ru = root(u); int rv = root(v); if (ru == rv) { T[ru] = min(T[ru], w); return; } if (depth[ru] > depth[rv]) { swap(ru, rv); } T[rv] = min(T[rv], max(T[ru], w)); if (deg[u] >= 3 || deg[v] >= 3) { T[rv] = min(T[rv], w); } par[ru] = {rv, w}; tree.push_back({ru, rv}); if (depth[ru] == depth[rv]) { depth[rv]++; } } void init(int _N, int _M, vector<int> U, vector<int> V, vector<int> W) { N = _N; M = _M; sub1 = (M == (N - 1)); sub2 = true; vector<pair<int, pair<int, int>>> edges(M); for (int i = 0; i < M; i++) { adj[U[i]].push_back({V[i], W[i]}); adj[V[i]].push_back({U[i], W[i]}); edges[i] = make_pair(W[i], make_pair(U[i], V[i])); } for (int i = 0; i < N; i++) { T[i] = inf; par[i] = {-1, -1}; } sort(edges.begin(), edges.end()); for (auto e: edges) { int w = e.first; int u = e.second.first; int v = e.second.second; update(u, v, w); } for (int i = 0; i < N; i++) { depth[i] = -1; } ROOT = root(0); depth[ROOT] = 1; reverse(tree.begin(), tree.end()); for (auto e: tree) { int u = e.first; int v = e.second; assert(depth[v] != -1); depth[u] = depth[v] + 1; } for (int i = 0; i < N; i++) { assert(depth[i] != -1); if (i != ROOT) { assert(par[i].first != -1); } } } void dfs(int u) { flag[u] = true; int cnt = 0; for (auto e: adj[u]) { int v = e.first; int w = e.second; if (w <= lim) { cnt++; } if (w <= lim && !flag[v]) { dfs(v); } } f1 &= (cnt <= 2); f2 |= (cnt <= 1); } int getMinimumFuelCapacity(int u, int v) { int tmp_u = u; int tmp_v = v; int res1 = 0; int res2 = inf; if (depth[u] < depth[v]) { swap(u, v); } while (depth[u] != depth[v]) { res1 = max(res1, par[u].second); u = par[u].first; assert(u != -1); } while (u != v) { res1 = max(res1, par[u].second); u = par[u].first; res1 = max(res1, par[v].second); v = par[v].first; assert(u != -1); assert(v != -1); } u = tmp_u; int cur = 0; int res7 = inf; while (u != -1) { res7 = min(res7, max(T[u], cur)); cur = max(cur, par[u].second); u = par[u].first; } v = tmp_v; cur = 0; int res8 = inf; while (v != -1) { res8 = min(res8, max(T[v], cur)); cur = max(cur, par[v].second); v = par[v].first; } int res = max(res1, min(res7, res8)); if (res == inf) { return -1; } else { return res; } }

Compilation message (stderr)

swap.cpp: In function 'int getMinimumFuelCapacity(int, int)':
swap.cpp:114:6: warning: unused variable 'res2' [-Wunused-variable]
  114 |  int res2 = inf;
      |      ^~~~
#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...