Submission #860376

#TimeUsernameProblemLanguageResultExecution timeMemory
860376iskhakkutbilimValley (BOI19_valley)C++17
100 / 100
143 ms57532 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define int long long
#define ff first
#define ss second
#define all(a) a.begin(), a.end()
const int MAX = 2e17;
const int N = 1e5;
const int LOG = 17;
int n, s, q, e;
vector< pair<int, int> > g[N + 1];
vector< pair<int, int> > edges;
int is_shop[N+1], depth_sum[N+1];
int depth[N+1], tin[N+1], tout[N+1];
int timer, la[N*2][LOG + 5] ,up[N+1][LOG+2];
int lg[N*2 + 100], dist_shop[N + 10];
void dfs(int v, int par){
	tin[v] = timer++;
	up[v][0] = par;
	for(int j = 1;j <= LOG; j++){
		up[v][j] = up[up[v][j-1]][j-1];
	}
	int distance = MAX;
	for(auto [to, w] : g[v]){
		if(to == par) continue;
		depth[to] = depth[v] + 1;
		depth_sum[to] = depth_sum[v] + w;
		dfs(to, v);
		distance = min(distance, dist_shop[to] + w);
	}	
	if(is_shop[v]){
		dist_shop[v] = 0;
	}else{
		dist_shop[v] = distance;
	}
	tout[v] = timer;
}
int is_parent(int par, int v){
	return (tin[par] <= tin[v] && tout[v] <= tout[par]);
}
int close(int idx){
	return (depth[edges[idx].ff] < depth[edges[idx].ss] ? edges[idx].ss : edges[idx].ff);
}
main(){
   ios::sync_with_stdio(0);
   cin.tie(0); cout.tie(0);
	cin >> n >> s >> q >> e;
	edges.push_back({-1, -1});
	for(int i = 1;i < n; i++){
		int a, b, w; cin >> a >> b >> w;
		g[a].push_back({b, w});
		g[b].push_back({a, w});
		edges.push_back({a, b});
	}
//	for(auto [x, y] : edges){
//		cout << x << ' ' << y << '\n';
//	}
//	cout << "\n" << '\n';
	for(int i = 0;i < s; i++){
		int x; cin >> x;
		is_shop[x] = 1;
	}
	dfs(e, e);
	for(int j = 0;j <= LOG; j++){
		for(int i = 1;i <= N; i++){
			if(j == 0){
				la[i][j] = dist_shop[i] - depth_sum[i];
			}else{
				la[i][j] = min(la[i][j-1], la[up[i][j-1]][j-1]);
			}
		}
	}
	while(q--){
		int idx, v; cin >> idx >> v;
	//	cout << edges[idx].ff << ' ' << edges[idx].ss << '\n';
		//	cout << v << " = " << close(idx) << '\n';
		if(!is_parent(close(idx), v)){
			cout << "escaped";
		}else{
			int k = depth[v] - depth[close(idx)];
			int mn = dist_shop[v], vert = v;
			for(int i = 0;i < LOG; i++){
				if(k & (1<<i)){
					mn = min(mn, la[vert][i] + depth_sum[v]);
					vert = up[vert][i];
				}
			}
			mn = min(mn, la[vert][0] + depth_sum[v]);
		//	cout << k << " = " << mn << '\n';
			if(mn >= (int)1e15) cout << "oo";
			else cout << mn;
		}
		cout << '\n';
	}
	return 0;
}

Compilation message (stderr)

valley.cpp:45:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   45 | main(){
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...