Submission #499295

#TimeUsernameProblemLanguageResultExecution timeMemory
499295sidonSwapping Cities (APIO20_swap)C++17
6 / 100
426 ms54296 KiB
#include <bits/stdc++.h> using namespace std; #include "swap.h" const int Z = 1e5, B = 18, INF = 2e9; array<int, B> p[Z], q[Z], r[Z]; vector<int> e(Z, -1), d(Z); vector<array<int, 2>> g[Z]; set<array<int, 2>> s[Z]; int find(int u) { return e[u] < 0 ? u : e[u] = find(e[u]); } void dfs_0(int u) { for(auto &[v, w] : g[u]) if(v != p[u][0]) { p[v][0] = u, q[v][0] = w, d[v] = d[u] + 1; dfs_0(v); if(size(s[u]) < size(s[v])) s[u].swap(s[v]); for(auto &i : s[v]) if(s[u].find(i) == end(s[u])) s[u].insert(i); else s[u].erase(i); } if(!empty(s[u])) r[u][0] = (*begin(s[u]))[0]; else r[u][0] = INF; } void dfs_1(int u) { for(int i = 1; i < B; i++) { p[u][i] = p[p[u][i-1]][i-1]; q[u][i] = max(q[u][i-1], q[p[u][i-1]][i-1]); r[u][i] = min(r[u][i-1], r[p[u][i-1]][i-1]); } for(auto &[v, w] : g[u]) if(v != p[u][0]) dfs_1(v); } void init(int N, int M, vector<int> U, vector<int> V, vector<int> W) { array<int, 3> h[M]; for(int i = 0; i < M; i++) { h[i] = {W[i], U[i], V[i]}; } sort(h, h+M); for(int i = 0; i < M; i++) { int u = find(h[i][1]), v = find(h[i][2]), w = h[i][0]; if(u == v) for(int k : {1, 2}) s[h[i][k]].insert({w, i}); else { if(e[u] > e[v]) swap(u, v); e[u] += e[v], e[v] = u; for(int k : {1, 2}) g[h[i][k]].push_back({h[i][3-k], w}); } } for(int &i : r[0]) i = INF; dfs_0(0), dfs_1(0); } int getMinimumFuelCapacity(int X, int Y) { int u = X, v = Y, qV = 0, rV = INF; if(d[u] > d[v]) swap(u, v); for(int i = 0; i < B; i++) { if((d[v] - d[u]) & (1<<i)) { qV = max(qV, q[v][i]); rV = min(rV, r[v][i]); v = p[v][i]; } } if(u != v) { for(int i = B; --i; ) { if(p[u][i] != p[v][i]) { qV = max({qV, q[u][i], q[v][i]}); rV = min({rV, r[u][i], r[v][i]}); u = p[u][i]; v = p[v][i]; } } qV = max({qV, q[u][0], q[v][0]}); rV = min({rV, r[u][0], r[v][0]}); } return rV == INF ? -1 : max(rV, qV); }
#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...