Submission #576401

#TimeUsernameProblemLanguageResultExecution timeMemory
576401ArnchSwapping Cities (APIO20_swap)C++17
100 / 100
391 ms65620 KiB
#include "swap.h" #include<bits/stdc++.h> using namespace std; const int N = 2e5 + 10, inf = 2e9, Log = 25; int n, m, up[N], vp[N], wp[N], h[N], ans[N], par[N][Log], p[N], tim; vector<int> sor; vector<int> child[N]; struct node { int par, sz, s, e, ans; bool isp; node() { par = sz = isp = s = e = 0; ans = inf; } } x[N << 2]; bool cmp(int i, int j) { return wp[i] < wp[j]; } int find(int u) { if(p[u] == u) return u; return p[u] = find(p[u]); } void merge(int u, int v, int t) { int X = find(u), Y = find(v); if(X == Y) { if(x[X].ans == inf) { x[X].ans = t; x[X].isp = 0; } return; } child[tim].push_back(X), child[tim].push_back(Y); x[tim].sz = x[X].sz + x[Y].sz; x[X].par = tim, x[Y].par = tim, p[X] = tim, p[Y] = tim; if(x[X].isp == 0 || x[Y].isp == 0) { x[tim].isp = 0; x[tim].ans = t; } else { if((u == x[X].s || u == x[X].e) && (v == x[Y].s || v == x[Y].e)) { x[tim].isp = 1; x[tim].ans = inf; x[tim].s = (u == x[X].s) ? (x[X].e) : (x[X].s); x[tim].e = (v == x[Y].s) ? (x[Y].e) : (x[Y].s); } else { x[tim].isp = 0; x[tim].ans = t; } } tim++; } void dfs(int u, int p) { ans[u] = min(ans[u], x[u].ans); par[u][0] = p; for(int i = 1; i < Log; i++) par[u][i] = par[par[u][i - 1]][i - 1]; for(auto i : child[u]) { h[i] = h[u] + 1; ans[i] = ans[u]; dfs(i, u); } } int get_par(int u, int y) { for(int i = 0; i < Log; i++) { if((y >> i) & 1) u = par[u][i]; } return u; } int lca(int u, int v) { if(h[u] > h[v]) swap(u, v); v = get_par(v, h[v] - h[u]); 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, m = M; for(int i = 0; i < m; i++) { up[i] = U[i], vp[i] = V[i], wp[i] = W[i]; sor.push_back(i); } sort(sor.begin(), sor.end(), cmp); tim = n; for(int i = 0; i < 2 * n; i++) { p[i] = i; x[i].par = i, x[i].sz = 1, x[i].e = i, x[i].s = i, x[i].isp = 1; } for(auto i : sor) { merge(up[i], vp[i], wp[i]); } for(int i = 0; i < 2 * N; i++) ans[i] = inf; dfs(tim - 1, tim - 1); } int getMinimumFuelCapacity(int X, int Y) { int lc = lca(X, Y); if(ans[lc] >= inf) return -1; return ans[lc]; }

Compilation message (stderr)

swap.cpp: In constructor 'node::node()':
swap.cpp:15:22: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   15 |   par = sz = isp = s = e = 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...