Submission #964718

#TimeUsernameProblemLanguageResultExecution timeMemory
964718socpiteSwapping Cities (APIO20_swap)C++14
6 / 100
72 ms16332 KiB
#include "swap.h" #include <bits/stdc++.h> using namespace std; const int maxn = 2e5+5; const int INF = 1e9+5; const int lg = 18; int n, m; int Wmax; int sp[lg][maxn]; int sp_mx[lg][maxn], sp_mn[lg][maxn]; int dep[maxn]; int in_tree[maxn]; vector<pair<int, int>> g[maxn]; vector<pair<int, pair<int, int>>> E; int up[maxn]; int Find(int x){ return up[x] != -1 ? up[x] = Find(up[x]) : x; } bool Union(int a, int b){ a = Find(a); b = Find(b); if(a == b)return false; up[a] = b; return true; } void dfs(int x, int p){ sp_mn[0][x] = INF; sp[0][x] = p; for(auto v: g[x]){ if(v.first == p)continue; dep[v.first] = dep[x] + 1; sp_mx[0][v.first] = v.second; dfs(v.first, x); } } void build(){ for(int i = 1; i < lg; i++){ for(int j = 0; j < n; j++){ if(sp[i-1][j] == -1)sp[i][j] = -1; else { sp[i][j] = sp[i-1][sp[i-1][j]]; sp_mx[i][j] = max(sp_mx[i-1][j], sp_mx[i-1][sp[i-1][j]]); } sp_mn[i][j] = INF; } } } void tup_upd(int &x, int dist, int w){ for(int i = 0; i < lg; i++){ if(dist&(1<<i)){ sp_mn[i][x] = w; x = sp[i][x]; } } } void upd_path(int a, int b, int w){ if(dep[a] < dep[b])swap(a, b); tup_upd(a, dep[a] - dep[b], w); if(a == b)return; for(int i = lg-1; i >= 0; i--){ if(sp[i][a] != sp[i][b]){ sp_mn[i][a] = min(sp_mn[i][a], w); sp_mn[i][b] = min(sp_mn[i][b], w); a = sp[i][a]; b = sp[i][b]; } } sp_mn[0][a] = min(sp_mn[0][a], w); sp_mn[0][b] = min(sp_mn[0][b], w); } void push(){ for(int i = lg-1; i > 0; i--){ for(int j = 0; j < n; j++){ if(sp[i][j] == -1)continue; sp_mn[i-1][j] = min(sp_mn[i-1][j], sp_mn[i][j]); sp_mn[i-1][sp[i-1][j]] = min(sp_mn[i-1][sp[i-1][j]], sp_mn[i][j]); } } } void tup_query(int &x, int dist, int &mx, int &mn){ for(int i = 0; i < lg; i++){ if(dist&(1<<i)){ mn = min(sp_mn[i][x], mn); mx = max(sp_mx[i][x], mx); x = sp[i][x]; } } } void init(int N, int M, std::vector<int> U, std::vector<int> V, std::vector<int> W) { n = N; m = M; Wmax = *max_element(W.begin(), W.end()); } int getMinimumFuelCapacity(int a, int b) { if(n == m)return Wmax; return -1; }
#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...