Submission #1158934

#TimeUsernameProblemLanguageResultExecution timeMemory
1158934nikolashamiValley (BOI19_valley)C++20
100 / 100
123 ms45664 KiB
#include<bits/stdc++.h>
using namespace std;
using ll=long long;

const ll N=1e5+4,inf=2e18;
vector<array<ll,2>>g[N];
ll f[N],shp[N],dep[N],up[N][17],fm[N][17];
array<ll,2>e[N];
ll tin[N],tout[N],ti,n,s,q,ext;

void dfs(ll u,ll p){
	f[u]=((shp[u]^1)*inf+dep[u]);
	up[u][0]=p;
	tin[u]=++ti;
	for(auto[v,w]:g[u]){
		if(!(v^p))continue;
		dep[v]=dep[u]+w;
		dfs(v,u);
		f[u]=min(f[u],f[v]);
	}
	tout[u]=++ti;
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    cin>>n>>s>>q>>ext;

    for(int i=1,u,v,w;i<n;++i){
    	cin>>u>>v>>w;
    	g[u].push_back({v,w});
    	g[v].push_back({u,w});
    	e[i]={u,v};
    }

    for(int i=0,ss;i<s;++i){
    	cin>>ss;
    	shp[ss]=1;
    }

    dfs(ext,0);

    for(int i=1;i<=n;++i){
    	fill(fm[i],fm[i]+17,inf);
    	f[i]-=2*dep[i];
    	fm[i][0]=f[i];
    }

    for(int i=1;i<17;++i){
    	for(int j=1;j<=n;++j){
    		up[j][i]=up[up[j][i-1]][i-1];
    		fm[j][i]=min(fm[j][i-1],fm[up[j][i-1]][i-1]);
    	}
    }

    auto anc=[](ll u,ll v){
    	return(tin[u]<=tin[v]&&tout[u]>=tout[v]);
    };

    while(q--){
    	ll E,U,ou;cin>>E>>U;
    	auto[u,v]=e[E];ou=U;
    	if(u==up[v][0])swap(u,v);
    	if(!anc(u,U)){cout<<"escaped\n";continue;}
    	ll mn=inf;
    	for(int i=16;i>=0;--i){
    		if(up[U][i]&&!anc(up[U][i],u))
    			mn=min(mn,fm[U][i]),U=up[U][i];
    	}
    	mn=min(mn,fm[U][(u!=U)]);
    	cout<<(mn>=inf/2?"oo":to_string(dep[ou]+mn))<<'\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...