Submission #1085252

#TimeUsernameProblemLanguageResultExecution timeMemory
1085252goduadzesabaValley (BOI19_valley)C++17
100 / 100
168 ms55228 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
int n,s,q,e,x,y,z,cur,tin[N],tout[N];
int val[N],dp[N],d[N],par[N][20],a[N][20];
vector <pair<int,int> > v[N],edg;
bool b[N]; vector <int> sv;
void dfs(int i,int p,int dd){
	cur++; tin[i]=cur;
	dp[i]=dp[p]+dd; d[i]=d[p]+1;
	par[i][0]=p; val[i]=(b[i]?0:1e15);
	for (int j=1; j<20; j++)
		par[i][j]=par[par[i][j-1]][j-1];
	for (auto j:v[i]){
		if (j.first==p) continue;
		dfs(j.first,i,j.second);
		val[i]=min(val[i],val[j.first]+j.second);
	}
	tout[i]=cur;
}
void dfs2(int i,int p){
	int xx=1e15;
	a[i][0]=min(xx,val[i]-dp[i]);
	for (int j=1; j<20; j++)
		a[i][j]=min(a[i][j-1],a[par[i][j-1]][j-1]);
	for (auto j:v[i]){
		if (j.first==p) continue;
		dfs2(j.first,i);
	}
}
bool ispar(int a,int b){
	if (tin[a]<=tin[b] && tout[a]>=tout[b])
		return 1;
	return 0;
}
int cnt(int i,int k){
	int res=1e15;
	for (int j=19; j>=0; j--)
		if ((1<<j)<=k){
			k-=(1<<j);
			res=min(res,a[i][j]);
			i=par[i][j];
		}
	return res;
}
signed main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>n>>s>>q>>e; edg.push_back({0,0});
	for (int i=1; i<n; i++){
		cin>>x>>y>>z;
		edg.push_back({x,y});
		v[x].push_back({y,z});
		v[y].push_back({x,z});
	}
	for (int i=1; i<=s; i++){
		cin>>x; b[x]=1;
	}
	for (int j=0; j<20; j++) a[0][j]=1e15;
	d[0]=-1; dfs(e,0,0); dfs2(e,0);
	/*for (int i=1; i<=n; i++)
		for (int j=0; j<20; j++)
			cout<<i<<" "<<j<<"-->"<<a[i][j]<<"\n";*/
	for (int i=1; i<=n; i++)
		if (b[i]) sv.push_back(tin[i]);
	sort(sv.begin(),sv.end());
	while (q--){
		cin>>x>>y;
		if (ispar(edg[x].second,edg[x].first))
			x=edg[x].first;
		else x=edg[x].second;
		if (!ispar(x,y)){
			cout<<"escaped\n"; continue;
		}
		auto it=lower_bound(sv.begin(),sv.end(),tin[x]);
		if (it==sv.end() || *it>tout[x]){
			cout<<"oo\n"; continue;
		}
		cout<<cnt(y,d[y]-d[x]+1)+dp[y]<<"\n";
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...