Submission #1175769

#TimeUsernameProblemLanguageResultExecution timeMemory
1175769MuhammetSwapping Cities (APIO20_swap)C++17
100 / 100
274 ms84048 KiB
#include "bits/stdc++.h" #include "swap.h" // #include "grader.cpp" using namespace std; #define ff first #define ss second const int N = 6e5 + 5; int p[N], a[N], c[N], h[N], par[N], sp[N][35]; pair <int, int> r[N]; vector <int> v[N]; int fnd(int x) { if(p[x] == x) return x; return p[x] = fnd(p[x]); } void dfs(int x, int y) { h[x] = h[y] + 1; par[x] = y; for(auto i : v[x]) { dfs(i, x); } } int lca(int x, int y) { if(h[x] < h[y]) swap(x, y); for(int i = 29; i >= 0; i--) { if(h[sp[x][i]] >= h[y]) x = sp[x][i]; } if(x == y) return x; for(int i = 29; i >= 0; i--) { if(sp[x][i] != sp[y][i]) x = sp[x][i], y = sp[y][i]; } return par[x]; } void init(int n, int m, vector<int> U1, vector<int> U2, vector<int> W) { vector <pair <int, pair <int, int>>> v1; for(int i = 0; i < m; i++) { v1.push_back({W[i], {U1[i]+1, U2[i]+1}}); } sort(v1.begin(), v1.end()); for(int i = 0; i <= 2 * (n + m); i++) { p[i] = i; r[i] = {i, i}; } int u3 = n; for(auto [w, u] : v1) { auto [u1, u2] = u; u1 = fnd(u1), u2 = fnd(u2); u3++; p[u1] = p[u2] = u3; c[u3] = w; if(u1 != u2) { if(a[u1] or a[u2]) a[u3] = true; else { if((u.ff == r[u1].ff or u.ff == r[u1].ss) and (u.ss == r[u2].ff or u.ss == r[u2].ss)) { if(u.ff == r[u1].ff) r[u3].ff = r[u1].ss; else r[u3].ff = r[u1].ff; if(u.ss == r[u2].ff) r[u3].ss = r[u2].ss; else r[u3].ss = r[u2].ff; } else a[u3] = true; } v[u3].push_back(u1); v[u3].push_back(u2); } else { a[u3] = true; v[u3].push_back(u1); } } dfs(u3, 0); for(int i = 0; i <= u3; i++) { sp[i][0] = par[i]; } for(int j = 1; j < 30; j++) { for(int i = 0; i <= u3; i++) { sp[i][j] = sp[sp[i][j-1]][j-1]; } } a[0] = 1; c[0] = -1; return; } int getMinimumFuelCapacity(int x, int y) { int z = lca(x+1, y+1); if(a[z]) return c[z]; for(int i = 29; i >= 0; i--) { if(!a[sp[z][i]]) z = sp[z][i]; } return c[par[z]]; }
#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...