제출 #387854

#제출 시각아이디문제언어결과실행 시간메모리
387854AmShZ자매 도시 (APIO20_swap)C++11
6 / 100
717 ms74912 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]; pii mx[xm][xn]; bool inmst[xn]; set <pii> st[xn], ts[xn]; vector <pip> E; vector <pii> adj[xn], G[xn]; 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); } for (pii u : adj[v]){ if (u.A == par[0][v]) continue; par[0][u.A] = v; mx[0][u.A] = {E[u.B].A, mn[v]}; H[u.A] = H[v] + 1; preDFS(u.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); a[v] = inf; if (SZ(st[rt])) 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; 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; ans = max(ans, mx[i][u].A); res = min(res, mx[i][u].B); u = par[i][u]; } 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); res = min(res, mx[0][v].B); ans = max(ans, mx[0][u].A); res = min(res, mx[0][u].B); } 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 */

컴파일 시 표준 에러 (stderr) 메시지

swap.cpp: In function 'void init(int, int, std::vector<int>, std::vector<int>, std::vector<int>)':
swap.cpp:119:29: warning: unused variable 'w' [-Wunused-variable]
  119 |   int v = e.B.A, u = e.B.B, w = e.A;
      |                             ^
swap.cpp: In function 'int getMinimumFuelCapacity(int, int)':
swap.cpp:145:6: warning: unused variable 'lca' [-Wunused-variable]
  145 |  int lca = LCA(v, u), res = inf, ans = 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...