Submission #1209503

#TimeUsernameProblemLanguageResultExecution timeMemory
1209503vaneaValley (BOI19_valley)C++20
23 / 100
107 ms23240 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; const int mxN = 1e5+10; const ll INF = 1e18; vector<array<int, 2>> adj[mxN]; int anc[mxN][20], sub_esc[mxN], d[mxN]; ll dist[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; 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); sub_esc[node] |= sub_esc[it]; } if(node == e) sub_esc[node] = 1; } 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}); } for(int i = 0; i < s; i++) { int k; cin >> k; sp[k] = true; } dfs(1, 0, e); 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); bool fnd = true; if(d[k] >= d[b]) { int anc1 = lca(b, k); if(sub_esc[b] && anc1 != b) { fnd = false; } else if(!sub_esc[b] && anc1 == b) { fnd = false; } else { cout << "escaped\n"; } } else { if(sub_esc[b]) { fnd = false; } else { cout << "escaped\n"; } } if(fnd) continue; if(s == n) { cout << 0 << '\n'; continue; } ll mn = INF; int anc1 = lca(b, k); for(int i = 1; i <= n; i++) { if(sp[i]) { int anc2 = lca(i, b); if(anc2 == b && anc1 == b) { mn = min(mn, dist[k] + dist[i] - 2*dist[b]); } else if(anc2 != b && anc1 != b) { int anc3 = lca(i, k); mn = min(mn, dist[k] + dist[i] - 2*dist[anc3]); } } } if(mn == INF) cout << "oo\n"; else cout << mn << '\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...