Submission #1209540

#TimeUsernameProblemLanguageResultExecution timeMemory
1209540vaneaValley (BOI19_valley)C++20
36 / 100
3095 ms35472 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int mxN = 1e5+10; const ll INF = 1e16; vector<array<int, 2>> adj[mxN]; int anc[mxN][20], d[mxN]; ll magic[mxN][20]; ll dist[mxN], mn[mxN]; bool sp[mxN]; void jmp(int &x, int dist) { for(int k = 19; k >= 0; k--) { if(dist & (1 << k)) x = anc[x][k]; } } int lca(int a, int b) { if(d[b] > d[a]) swap(a, b); jmp(a, d[a]-d[b]); if(a == b) return a; for(int k = 19; k >= 0; k--) { if(anc[a][k] != anc[b][k]) { a = anc[a][k]; b = anc[b][k]; } } return anc[a][0]; } void dfs(int node, int p, int e) { anc[node][0] = p; if(node == e) anc[node][0] = e; if(sp[node]) mn[node] = dist[node]; for(int k = 1; k <= 19; k++) { anc[node][k] = anc[anc[node][k-1]][k-1]; } for(auto [it, w] : adj[node]) { if(it == p) continue; d[it] = d[node]+1; dist[it] = dist[node] + w; dfs(it, node, e); mn[node] = min(mn[node], mn[it]); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, s, q, e; cin >> n >> s >> q >> e; vector<array<int, 3>> queries; for(int i = 1; i < n; i++) { int a, b, w; cin >> a >> b >> w; adj[a].push_back({b, w}); adj[b].push_back({a, w}); queries.push_back({a, b, w}); mn[i] = INF; } mn[n] = INF; for(int i = 0; i < s; i++) { int k; cin >> k; sp[k] = true; } dfs(e, 0, e); for(int i = 1; i <= n; i++) { if(mn[i] != INF) mn[i] = mn[i] - 2 * dist[i]; magic[i][0] = mn[i]; } for(int k = 1; k <= 19; k++) { for(int i = 1; i <= n; i++) { magic[i][k] = min(magic[i][k-1], magic[anc[i][k-1]][k-1]); } } while(q--) { int idx; int k; cin >> idx >> k; --idx; int a = queries[idx][0], b = queries[idx][1]; if(d[b] < d[a]) swap(a, b); int anc1 = lca(k, b); if(anc1 != b) { cout << "escaped\n"; continue; } ll ans = INF; int x = k; while(x != b) { ans = min(ans, mn[x]+dist[k]); x = anc[x][0]; } ans = min(ans, mn[b]+dist[k]); if(ans == INF) cout << "oo\n"; else cout << ans << '\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...