제출 #859115

#제출 시각아이디문제언어결과실행 시간메모리
859115NK_Valley (BOI19_valley)C++17
100 / 100
200 ms48592 KiB
// Success consists of going from failure to failure without loss of enthusiasm
#include <bits/stdc++.h>
 
using namespace std;
 
#define nl '\n'
#define pb push_back
#define pf push_front
 
#define mp make_pair
#define f first
#define s second
#define sz(x) int(x.size())
 
template<class T> using V = vector<T>;
using pi = pair<int, int>;
using vi = V<int>;
using vpi = V<pi>;
 
using ll = long long;
using pl = pair<ll, ll>;
using vpl = V<pl>;
using vl = V<ll>;
 
using db = long double;
 
template<class T> using pq = priority_queue<T, V<T>, greater<T>>;
 
const int MOD = 1e9 + 7;
const ll INFL = ll(1e17);
const int LG = 18;

using T = array<int, 3>;

int main() {
	cin.tie(0)->sync_with_stdio(0);

	int N, M, Q, R; cin >> N >> M >> Q >> R; --R;

	V<V<T>> adj(N);
	for(int i = 0; i < N - 1; i++) {
		int u, v, w; cin >> u >> v >> w; --u, --v;
		adj[u].pb({v, w, i});
		adj[v].pb({u, w, i});
	}


	vi st(N), en(N), dep(N), E(N-1); vl dst(N), close(N, INFL);
	V<vl> mn(N, vl(LG, INFL)); V<vi> up(N, vi(LG));

	for(int i = 0; i < M; i++) {
		int u; cin >> u; --u; close[u] = 0;
	}

	int t = 0;
	function<void(int, int)> gen = [&](int u, int p) {
		st[u] = t++;

		for(auto& e : adj[u]) {
			auto [v, w, i] = e; if (v == p) continue;
			
			E[i] = v; dst[v] = dst[u] + w; dep[v] = dep[u] + 1;
			
			gen(v, u);

			close[u] = min(close[v] + w, close[u]);
		}
		
		en[u] = t-1;
	};

	dst[R] = dep[R] = 0; gen(R, -1);

	function<void(int, int)> dfs = [&](int u, int p) {
		mn[u][0] = close[u] - dst[u];
		up[u][0] = (p == -1 ? u : p);

		for(int i = 1; i < LG; i++) {
			up[u][i] = up[up[u][i-1]][i-1];
			mn[u][i] = min(mn[u][i-1], mn[up[u][i-1]][i-1]);
		}

		for(auto& e : adj[u]) {
			auto [v, w, i] = e; if (v == p) continue;

			dfs(v, u);
		}
	};

	dfs(R, -1);

	auto isAnc = [&](int a, int b) {
		return st[a] <= st[b] && en[b] <= en[a];
	};

	for(int i = 0; i < Q; i++) {
		int e, u; cin >> e >> u; --e, --u;
		int p = E[e];
		if (isAnc(p, u)) {
			int d = dep[u] - dep[p] + 1; ll D = dst[u], ans = INFL;

			for(int x = 0; x < LG; x++) if ((d >> x) & 1) {
				ans = min(ans, mn[u][x]);
				u = up[u][x];
			}

			ans += D;
			if (ans >= INFL) cout << "oo" << nl;
			else cout << ans << nl;

		} else cout << "escaped" << nl;
	}

	exit(0-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...