제출 #387889

#제출 시각아이디문제언어결과실행 시간메모리
387889AmShZ자매 도시 (APIO20_swap)C++11
13 / 100
987 ms109812 KiB
// khodaya khodet komak kon # include <bits/stdc++.h> /* // ordered_set # include <ext/pb_ds/assoc_container.hpp> # include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; # define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update> */ using namespace std; typedef long long ll; typedef long double ld; typedef pair <int, int> pii; typedef pair <ll, ll> pll; typedef pair <pll, ll> ppi; typedef pair <int, pii> pip; typedef pair <pii, pii> ppp; # define A first # define B second # define endl '\n' # define sep ' ' # define all(x) x.begin(), x.end() # define kill(x) return cout << x << endl, 0 # define SZ(x) int(x.size()) # define lc id << 1 # define rc id << 1 | 1 # define InTheNameOfGod ios::sync_with_stdio(0);cin.tie(0); cout.tie(0); ll power(ll a, ll b, ll md) {return (!b ? 1 : (b & 1 ? a * power(a * a % md, b / 2, md) % md : power(a * a % md, b / 2, md) % md));} const int xn = 2e5 + 10; const int xm = 10 + 10; const int sq = 320; const int inf = 1e9 + 10; const ll INF = 1e18 + 10; const int mod = 1e9 + 7;//998244353; const int base = 257; int dsu[xn], sz[xn], par[xm][xn]; int H[xn], mn[xn], a[xn], wp[xn]; pii mx[xm][xn]; bool inmst[xn]; set <pii> st[xn], ts[xn], S[xn], T[xn]; vector <pip> E; vector <pii> adj[xn], G[xn], vec; int get_root(int v){ if (v == dsu[v]) return v; return dsu[v] = get_root(dsu[v]); } void preDFS(int v){ for (int i = 1; i < xm; ++ i){ par[i][v] = par[i - 1][par[i - 1][v]]; mx[i][v].A = max(mx[i - 1][v].A, mx[i - 1][par[i - 1][v]].A); mx[i][v].B = min(mx[i - 1][v].B, mx[i - 1][par[i - 1][v]].B); } vec.clear(); for (pii u : adj[v]) if (u.A != par[0][v]) vec.push_back({E[u.B].A, u.A}), S[v].insert({E[u.B].A, u.A}); sort(all(vec)); for (int i = 1; i < SZ(vec); ++ i) mx[0][vec[i].B].B = min(mn[v], vec[0].A); if (SZ(vec)) mx[0][vec[0].B].B = mn[v]; if (SZ(vec) > 1) mx[0][vec[0].B].B = min(mn[v], vec[1].A); a[v] = inf; int ted = 0; for (pii x : T[v]){ ++ ted; if (ted == 3){ a[v] = x.A; break; } } for (pii u : adj[v]){ if (u.A == par[0][v]) continue; par[0][u.A] = v; mx[0][u.A].A = E[u.B].A; H[u.A] = H[v] + 1; wp[u.A] = E[u.B].A; preDFS(u.A); a[v] = min(a[v], max(a[u.A], E[u.B].A)); } } int LCA(int v, int u){ if (H[v] > H[u]) swap(v, u); for (int i = xm - 1; i >= 0; -- i) if ((1 << i) <= H[u] - H[v]) u = par[i][u]; if (v == u) return v; for (int i = xm - 1; i >= 0; -- i) if (par[i][v] != par[i][u]) v = par[i][v], u = par[i][u]; return par[0][v]; } void merge(int v, int u){ v = get_root(v); u = get_root(u); if (sz[v] < sz[u]) swap(v, u); dsu[u] = v, sz[v] += sz[u]; for (pii x : st[u]) st[v].insert(x); } void DFS(int v){ for (pii u : adj[v]) if (u.A != par[0][v]) DFS(u.A), merge(v, u.A); int rt = get_root(v); for (pii u : G[v]){ int lca = LCA(v, u.A); st[rt].insert({E[u.B].A, u.B}); ts[lca].insert({E[u.B].A, u.B}); } for (pii x : ts[v]) st[rt].erase(x); if (SZ(st[rt])) a[v] = min(a[v], st[rt].begin() -> A); } void init(int n, int m, vector <int> V, vector <int> U, vector <int> W){ for (int i = 1; i <= n; ++ i) dsu[i] = i, sz[i] = 1; for (int i = 0; i < m; ++ i){ int v = V[i] + 1, u = U[i] + 1, w = W[i]; E.push_back({w, {v, u}}); } sort(all(E)); for (int i = 0; i < m; ++ i){ pip e = E[i]; int v = e.B.A, u = e.B.B, w = e.A; int pv = v, pu = u; T[v].insert({w, u}); T[u].insert({w, v}); v = get_root(v); u = get_root(u); if (v == u){ G[pv].push_back({pu, i}); G[pu].push_back({pv, i}); continue; } if (sz[v] < sz[u]) swap(v, u); inmst[i] = true; dsu[u] = v, sz[v] += sz[u]; adj[pv].push_back({pu, i}); adj[pu].push_back({pv, i}); } for (int i = 1; i <= n; ++ i){ dsu[i] = i, sz[i] = 1; mn[i] = inf; for (pii u : G[i]) mn[i] = min(mn[i], E[u.B].A); } preDFS(1), DFS(1); } int getMinimumFuelCapacity(int v, int u){ ++ v, ++ u; int lca = LCA(v, u), res = inf, ans = 0; int pv = v, pu = u; if (H[v] > H[u]) swap(v, u); for (int i = xm - 1; i >= 0; -- i){ if (H[u] - H[v] < (1 << i)) continue; if (H[u] - H[v] == (1 << i) && v == lca) continue; ans = max(ans, mx[i][u].A); res = min(res, mx[i][u].B); u = par[i][u]; } if (v == lca){ ans = max(ans, mx[0][u].A); res = min(res, mn[lca]); u = v; } for (int i = xm - 1; i >= 0; -- i){ if (par[i][v] == par[i][u]) continue; ans = max(ans, mx[i][v].A); res = min(res, mx[i][v].B); ans = max(ans, mx[i][u].A); res = min(res, mx[i][u].B); v = par[i][v], u = par[i][u]; } if (v != u){ ans = max(ans, mx[0][v].A); ans = max(ans, mx[0][u].A); res = min(res, mn[lca]); for (pii x : S[lca]){ if (x.B != v && x.B != u){ res = min(res, x.A); break; } } if (lca - 1) res = min(res, wp[lca]); } v = pv, u = pu; res = min(res, min(a[v], a[u])); if (res == inf) return - 1; return max(ans, res); } /* int n, m, q; vector <int> V, U, W; int main(){ InTheNameOfGod; cin >> n >> m; for (int i = 0; i < m; ++ i){ int v, u, w; cin >> v >> u >> w; V.push_back(v); U.push_back(u); W.push_back(w); } init(n, m, V, U, W); cin >> q; while (q --){ int v, u; cin >> v >> u; cout << getMinimumFuelCapacity(v, u) << endl; } return 0; } 5 6 0 1 4 0 2 4 1 4 10 1 3 2 1 2 1 2 3 3 3 1 2 2 4 0 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...