Submission #545851

#TimeUsernameProblemLanguageResultExecution timeMemory
545851StickfishValley (BOI19_valley)C++17
36 / 100
3073 ms13696 KiB
#include <iostream> #include <vector> #include <bitset> using namespace std; using ll = long long; const int MAXN = 1e5 + 123; const ll INF = 1e18 + 177013; const ll LESSINF = 1e14 + 177013; vector<pair<int, ll>> edg[MAXN]; vector<pair<int, int>> qrs[MAXN]; bitset<MAXN> shop; int tin[MAXN]; int tout[MAXN]; ll depth[MAXN]; vector<int> rtin; int rt[MAXN]; void dfs(int v) { tin[v] = rtin.size(); rtin.push_back(v); for (auto [u, w] : edg[v]) { if (u == rt[v]) continue; rt[u] = v; depth[u] = depth[v] + w; dfs(u); } tout[v] = rtin.size(); } int e; ll ans_dfs(int v, int urest, int rt0, ll d) { if (v == e) return -1; ll ans = INF; if (shop[v]) ans = d; for (auto [u, w] : edg[v]) { if (u == rt0 || (v == urest && rt[v] == u) || (u == urest && rt[u] == v)) continue; ans = min(ans, ans_dfs(u, urest, v, d + w)); } return ans; } signed main() { int n, s, q; cin >> n >> s >> q >> e; vector<pair<int, int>> roads(n - 1); --e; for (int i = 0; i < n - 1; ++i) { int u, v, w; cin >> u >> v >> w; --u, --v; edg[u].push_back({v, w}); edg[v].push_back({u, w}); roads[i] = {u, v}; } for (int i = 0; i < s; ++i) { int c; cin >> c; shop[c - 1] = 1; } dfs(0); for (auto& [ru, rv] : roads) { if (rt[rv] == ru) swap(rv, ru); } for (int i = 0; i < q; ++i) { int ri, v; cin >> ri >> v; --ri, --v; int u = roads[ri].first; ll ans = ans_dfs(v, u, -1, 0); if (ans == -1) { cout << "escaped\n"; } else if (ans > LESSINF) { cout << "oo\n"; } else { cout << ans << '\n'; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...