Submission #1282362

#TimeUsernameProblemLanguageResultExecution timeMemory
1282362peanutValley (BOI19_valley)C++20
59 / 100
97 ms22768 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 5; struct edge {int u, v, w;}; int n, q, s, e; vector<pair<int, int>> adj[maxn]; int dep[maxn], up[maxn][20], tin[maxn], tout[maxn], timer; long long dist[maxn]; int shops[maxn]; edge edges[maxn]; void dfs(int u, int p) { tin[u] = ++timer; for (auto [v, w] : adj[u]) { if (v == p) continue; dep[v] = dep[u] + 1; dist[v] = dist[u] + w; up[v][0] = u; for (int i = 1; i < 20; ++i) up[v][i] = up[up[v][i-1]][i-1]; dfs(v, u); } tout[u] = timer; } bool isancestor(int u, int v) {return tin[u] <= tin[v] && tout[v] <= tout[u];} int lca(int u, int v) { if (dep[u] < dep[v]) swap(u, v); int k = dep[u] - dep[v]; for (int i = 0; i < 20; ++i) if (k >> i & 1) u = up[u][i]; if (u == v) return u; for (int i = 19; i >= 0; --i) { if (up[u][i] != up[v][i]) { u = up[u][i], v = up[v][i]; } } return up[u][0]; } long long calc(int u, int v) {return dist[u] + dist[v] - 2 * dist[lca(u, v)];} namespace subtask123 { bool check() { return (n * q <= 1000000) || (s == n); } void solve() { while (q--) { int blocked, r; cin >> blocked >> r; int v = (dep[edges[blocked].u] < dep[edges[blocked].v]) ? edges[blocked].v : edges[blocked].u; if ((isancestor(v, r) ^ isancestor(v, e)) == 0) { cout << "escaped\n"; continue; } if (s == n) cout << 0 << '\n'; else { long long mindist = LLONG_MAX; for (int i = 1; i <= s; ++i) { if ((isancestor(v, r) ^ isancestor(v, shops[i])) == 0) mindist = min(mindist, calc(shops[i], r)); } if (mindist == LLONG_MAX) cout << "oo\n"; else cout << mindist << '\n'; } } } } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> s >> q >> e; for (int i = 1; i < n; ++i) { int u, v, w; cin >> u >> v >> w; adj[u].push_back({v, w}); adj[v].push_back({u, w}); edges[i] = {u, v, w}; } for (int i = 1; i <= s; ++i) cin >> shops[i]; dfs(1, 0); if (subtask123::check()) subtask123::solve(); 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...