Submission #764644

#TimeUsernameProblemLanguageResultExecution timeMemory
764644raysh07Swapping Cities (APIO20_swap)C++17
37 / 100
2082 ms7268 KiB
#include "swap.h" #include <bits/stdc++.h> using namespace std; struct edge{ int u, v, w; }; int n, m; const int maxn = 1e5 + 69; vector <edge> e; int root[maxn], deg[maxn], edg[maxn]; int find(int x){ if (x == root[x]) return x; return root[x] = find(root[x]); } void unite(int x, int y){ x = find(x); y = find(y); if (x == y) { edg[x]++; return; } root[y] = x; edg[x] += edg[y]; } void init(int N, int M, vector<int> U, vector<int> V, vector<int> W) { n = N; m = M; e.resize(m); for (int i = 0; i < m; i++) { e[i].u = U[i]; e[i].v = V[i]; e[i].w = W[i]; } } int getMinimumFuelCapacity(int x, int y) { int l = 0, r = 1e9 + 1; while (l != r){ int mid = (l + r)/2; for (int i = 0; i < n; i++){ root[i] = i; edg[i] = 0; deg[i] = 0; } for (int i = 0; i < m; i++){ if (e[i].w > mid) continue; deg[e[i].u]++; deg[e[i].v]++; unite(e[i].u, e[i].v); } bool found = false; if (find(x) != find(y)) { l = mid + 1; continue; } if (edg[find(x)]) { found = true; } for (int i = 0; i < n; i++){ if (find(i) == find(x) && deg[i] >= 3) //can turn here found = true; } if (found) r = mid; else l = mid + 1; } if (l > 1e9) return -1; return l; }
#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...