Submission #1267997

#TimeUsernameProblemLanguageResultExecution timeMemory
1267997wedonttalkanymoreEvacuation plan (IZhO18_plan)C++20
100 / 100
474 ms80500 KiB
#include <bits/stdc++.h> /* Strat code: - Thinking about how to solve the full problems: 15 min - Thinking about subtasks + code: 30 min - Stress: 10 - 15 min => Total need 2h15m */ using namespace std; using ll = long long; #define int long long #define pii pair<ll, ll> #define fi first #define se second const ll N = 5e5 + 5, inf = 1e18, mod = 1e9 + 7, block = 320, lim = 19; int n, m; struct item { int u, v, w; } a[N]; vector <pii> adj[N], adj1[N]; int k; int p[N], length[N]; int q; void dijk() { for (int i = 1; i <= n; i++) { length[i] = inf; } priority_queue <pii, vector <pii>, greater <pii> > pq; for (int i = 1; i <= k; i++) { length[p[i]] = 0; pq.push({0, p[i]}); } while(pq.size()) { auto [c, u] = pq.top(); pq.pop(); if (c > length[u]) continue; for (auto [v, w] : adj[u]) { if (length[v] > length[u] + w) { length[v] = length[u] + w; pq.push({length[v], v}); } } } } bool cmp(item a, item b) { int x = min(length[a.u], length[a.v]); int y = min(length[b.u], length[b.v]); return x > y; } struct krushkal { int par[N], sz[N]; void makeset() { for (int i = 1; i <= n; i++) { par[i] = i; sz[i] = 1; } } int find(int u) { if (u == par[u]) return u; return par[u] = find(par[u]); } void join(int u, int v) { u = find(u), v = find(v); if (u != v) { if (sz[u] < sz[v]) swap(u, v); sz[u] += sz[v]; par[v] = u; } } void solve() { makeset(); for (int i = 1; i <= m; i++) { int u = find(a[i].u), v = find(a[i].v); if (u != v) { adj1[a[i].u].emplace_back(a[i].v, min(length[a[i].u], length[a[i].v])); adj1[a[i].v].emplace_back(a[i].u, min(length[a[i].u], length[a[i].v])); join(a[i].u, a[i].v); } } } } mst; namespace cal { int up[N][lim + 1], weight[N][lim + 1], h[N]; void dfs(int u, int par) { up[u][0] = par; for (int i = 1; i <= lim; i++) { up[u][i] = up[up[u][i - 1]][i - 1]; weight[u][i] = min(weight[up[u][i - 1]][i - 1], weight[u][i - 1]); } for (auto [v, w] : adj1[u]) { if (v == par) continue; weight[v][0] = w; h[v] = h[u] + 1; dfs(v, u); } } int get(int u, int v) { if (u == v) return length[u]; if (h[u] < h[v]) swap(u, v); int res = inf; for (int i = lim; i >= 0; i--) { if (h[u] - (1 << i) >= h[v]) { res = min(res, weight[u][i]); u = up[u][i]; } } if (u == v) return res; for (int i = lim; i >= 0; i--) { if (up[u][i] != up[v][i]) { res = min({res, weight[u][i], weight[v][i]}); u = up[u][i]; v = up[v][i]; } } return min({res, weight[u][0], weight[v][0]}); } void process() { for (int i = 1; i <= n; i++) { for (int j = 0; j <= lim; j++) weight[i][j] = inf; } } }; signed main() { ios::sync_with_stdio(false); cin.tie(0); if (fopen(".inp", "r")) { freopen(".inp", "r", stdin); freopen(".out", "w", stdout); } cin >> n >> m; for (int i = 1; i <= m; i++) { cin >> a[i].u >> a[i].v >> a[i].w; adj[a[i].u].emplace_back(a[i].v, a[i].w); adj[a[i].v].emplace_back(a[i].u, a[i].w); } cin >> k; for (int i = 1; i <= k; i++) cin >> p[i]; dijk(); // for (int i = 1; i <= n; i++) cout << length[i] << ' '; sort(a + 1, a + m + 1, cmp); mst.solve(); cal::process(); cal::dfs(1, 0); cin >> q; for (int i = 1; i <= q; i++) { int u, v; cin >> u >> v; cout << cal::get(u, v) << '\n'; } return 0; }

Compilation message (stderr)

plan.cpp: In function 'int main()':
plan.cpp:135:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  135 |         freopen(".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~
plan.cpp:136:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  136 |         freopen(".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
#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...