Submission #1092796

#TimeUsernameProblemLanguageResultExecution timeMemory
1092796juicyValley (BOI19_valley)C++17
100 / 100
110 ms37716 KiB
#include <bits/stdc++.h> using namespace std; #ifdef LOCAL #include "debug.h" #else #define debug(...) 42 #endif const int N = 1e5 + 5, LG = 17; const long long inf = 1e18; int n, k, q, rt; int pr[LG][N], h[N], ver[N], w[N]; bool shop[N]; long long dep[N], a[LG][N], best[N]; vector<array<int, 2>> g[N]; bool check(int p, int u) { for (int i = LG - 1; ~i; --i) { if (h[u] - (1 << i) >= h[p]) { u = pr[i][u]; } } return u == p; } void dfs(int u) { for (auto [v, id] : g[u]) { if (v ^ pr[0][u]) { ver[id] = v; pr[0][v] = u; dep[v] = dep[u] + w[id]; h[v] = h[u] + 1; dfs(v); best[u] = min(best[u], best[v]); } } best[u] = min(best[u], shop[u] ? dep[u] : inf); a[0][u] = best[u] == inf ? inf : best[u] - 2 * dep[u]; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> k >> q >> rt; for (int i = 1; i < n; ++i) { int u, v; cin >> u >> v >> w[i]; g[u].push_back({v, i}); g[v].push_back({u, i}); } while (k--) { int u; cin >> u; shop[u] = 1; } memset(best, 0x3f, sizeof(best)); dfs(rt); for (int i = 1; i < LG; ++i) { for (int u = 1; u <= n; ++u) { a[i][u] = min(a[i - 1][u], a[i - 1][pr[i - 1][u]]); pr[i][u] = pr[i - 1][pr[i - 1][u]]; } } while (q--) { int i, r; cin >> i >> r; i = ver[i]; if (check(i, r)) { long long x = inf; int u = r; for (int j = LG - 1; ~j; --j) { if (h[r] - (1 << j) >= h[i] - 1) { x = min(x, a[j][r]); r = pr[j][r]; } } if (x != inf) { cout << x + dep[u] << "\n"; } else { cout << "oo" << "\n"; } } else { cout << "escaped" << "\n"; } } 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...