Submission #1212841

#TimeUsernameProblemLanguageResultExecution timeMemory
1212841Hamed_GhaffariSwapping Cities (APIO20_swap)C++20
100 / 100
212 ms52288 KiB
#include "swap.h" #include <bits/stdc++.h> using namespace std; #define maxs(a, b) (a = max(a, b)) const int MXN = 3e5+5, LOG = 19; int n, h[MXN], par[MXN][LOG], dsu[MXN], sz[MXN], name[MXN], w[MXN], mx[MXN], d[MXN], timer; bool cyc[MXN]; vector<int> g[MXN]; int find(int v) { return v==dsu[v] ? v : dsu[v] = find(dsu[v]); } inline void add(int u, int v, int w) { int uu = find(u), vv = find(v); if(uu==vv) { par[name[uu]][0] = timer; g[timer].push_back(name[uu]); mx[timer] = max({mx[name[uu]], ++d[u], ++d[v]}); ::w[timer] = w; cyc[timer] = 1; name[uu] = timer++; return; } if(sz[uu]<sz[vv]) swap(uu, vv); par[name[uu]][0] = par[name[vv]][0] = timer; g[timer].push_back(name[uu]); g[timer].push_back(name[vv]); mx[timer] = max({mx[name[uu]], mx[name[vv]], ++d[u], ++d[v]}); cyc[timer] = cyc[name[uu]]|cyc[name[vv]]; ::w[timer] = w; sz[dsu[vv] = uu] += sz[vv]; name[uu] = timer++; } void dfs(int v) { for(int i=1; i<LOG; i++) par[v][i] = par[par[v][i-1]][i-1]; for(int u : g[v]) { h[u] = h[v]+1; dfs(u); } } inline int jump(int v, int d) { for(int i=0; i<LOG; i++) if(d>>i&1) v = par[v][i]; return v; } inline int LCA(int u, int v) { if(h[u]<h[v]) swap(u, v); u = jump(u, h[u]-h[v]); if(u==v) return u; for(int i=LOG-1; i>=0; i--) if(par[u][i]!=par[v][i]) u = par[u][i], v = par[v][i]; return par[u][0]; } void init(int N, int M, vector<int> U, vector<int> V, vector<int> W) { n = N; for(int i=0; i<N; i++) { dsu[i] = i; sz[i] = 1; name[i] = i; } timer = N; vector<int> ord(M); iota(ord.begin(), ord.end(), 0); sort(ord.begin(), ord.end(), [&](int i, int j) { return W[i] < W[j]; }); for(int i=0; i<M; i++) add(U[ord[i]], V[ord[i]], W[ord[i]]); par[timer-1][0] = timer-1; dfs(timer-1); } int getMinimumFuelCapacity(int X, int Y) { if(mx[timer-1]<=2 && !cyc[timer-1]) return -1; int v = LCA(X, Y); if(mx[v]>=3) return w[v]; for(int i=LOG-1; i>=0; i--) if(mx[par[v][i]]<=2 && !cyc[par[v][i]]) v = par[v][i]; return w[par[v][0]]; }
#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...