Submission #1199168

#TimeUsernameProblemLanguageResultExecution timeMemory
1199168yeediotSwapping Cities (APIO20_swap)C++20
0 / 100
133 ms42416 KiB
#include "swap.h" #include<bits/stdc++.h> using namespace std; #define F first #define S second #define all(x) x.begin(),x.end() #define pii pair<int,int> #define pb push_back #define sz(x) (int)(x.size()) #define chmin(x,y) x=min(x,y) #define chmax(x,y) x=max(x,y) #define vi vector<int> #define vp vector<pii> #define vvi vector<vi> #define ykh mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()) #define __lg(x) 63-__builtin_clzll(x) const int mxn = 3e5 + 5; int n, m, ty[mxn], cnt, val[mxn], jump[20][mxn], nxt[mxn], dep[mxn]; vector<int>adj[mxn]; struct DSU{ int to[mxn], num[mxn], f[mxn], s[mxn]; void init(){ for(int i = 0; i < mxn; i++){ to[i] = f[i] = s[i] = i; ty[i] = 0; num[i] = 1; } } int find(int x){ return x == to[x] ? x : to[x] = find(to[x]); } void add(int x, int c, bool t = 1){ cnt++; adj[cnt].pb(x); to[x] = cnt; val[cnt] = c; ty[cnt] = t; } void merge(int x, int y, int c){ int ox = x, oy = y; x = find(x), y = find(y); if(x == y){ if(ty[x] == 0){ add(x, c); } else{ } } else{ if(ty[x] == 0 and ty[y] == 0){ // 鏈 add(x, c); add(y, c); cnt++; adj[cnt].pb(cnt - 1); adj[cnt].pb(cnt - 2); val[cnt] = c; ty[cnt] = 1 - ((ox == f[x] or ox == s[x]) and (oy == f[y] or oy == s[y])); to[cnt - 1] = cnt; to[cnt - 2] = cnt; f[cnt] = f[x] ^ s[x] ^ ox; s[cnt] = f[y] ^ s[y] ^ oy; } else{ cnt++; ty[cnt] = 1; val[cnt] = c; adj[cnt].pb(x); adj[cnt].pb(y); to[y] = cnt; to[x] = cnt; } } } }d; void dfs(int v, int pa){ jump[0][v] = pa; nxt[v] = nxt[pa]; dep[v] = dep[pa] + 1; if(ty[v] == 1) nxt[v] = v; for(auto u : adj[v]){ dfs(u, v); } } int lca(int a, int b){ if(dep[a] < dep[b]) swap(a, b); int dif = dep[a] - dep[b]; for(int i = 19; i >= 0; i--){ if(dif >> i & 1) a = jump[i][a]; } if(a == b) return nxt[a]; for(int i = 19; i >= 0; i--){ if(jump[i][a] != jump[i][b]){ a = jump[i][a], b = jump[i][b]; } } return nxt[jump[0][a]]; } void init(int N, int M, std::vector<int> U, std::vector<int> V, std::vector<int> W) { n = N, m = M; d.init(); vector<array<int, 3>>edges; for(int i = 0; i < m; i++){ edges.pb({W[i], U[i] + 1, V[i] + 1}); } sort(all(edges)); cnt = n; for(auto [c, a, b] : edges){ d.merge(a, b, c); } dfs(cnt, cnt); for(int i = 1; i < 20; i++){ for(int j = 1; j <= cnt; j++){ jump[i][j] = jump[i - 1][jump[i - 1][j]]; } } } int getMinimumFuelCapacity(int X, int Y) { X++, Y++; int lc = lca(X, Y); if(lc == 0) return -1; else return val[lc]; return 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...