Submission #1303927

#TimeUsernameProblemLanguageResultExecution timeMemory
1303927WarinchaiValley (BOI19_valley)C++20
100 / 100
245 ms51124 KiB
#include<bits/stdc++.h>
#define int long long
using namespace std;

vector<pair<int,int>>adj[100005];
int shop[100005];
int in[100005];
int out[100005];
int dis[100005];
int lv[100005];
int cur;
int inf=1e15;
int pa[20][100005];
int mn[20][100005];
int go[100005];

void dfs(int u,int p){
    lv[u]=lv[p]+1;
    in[u]=++cur;
    dis[u]=inf;
    if(shop[u])dis[u]=0;
    for(auto [x,w]:adj[u])if(x!=p){
        dfs(x,u);
        dis[u]=min(dis[u],dis[x]+w);
    }
    out[u]=cur;
}

void efs(int u,int p,int d){
    go[u]=d;
    pa[0][u]=p;
    mn[0][u]=-d+dis[u];
    //cerr<<"u:"<<u<<' '<<dis[u]<<" "<<mn[0][u]<<"\n";
    for(int i=1;i<=19;i++)pa[i][u]=pa[i-1][pa[i-1][u]],mn[i][u]=min(mn[i-1][u],mn[i-1][pa[i-1][u]]);
    for(auto [x,w]:adj[u])if(x!=p){
        efs(x,u,d+w);
    }
}

int fans(int u,int x){
    int uu=u;
    int ans=inf;
    for(int i=19;i>=0;i--)if(lv[pa[i][u]]>=lv[x])ans=min(ans,mn[i][u]),u=pa[i][u];
    ans=min(ans,mn[0][u]);
    //cerr<<"end:"<<u<<" "<<x<<":"<<ans<<"\n";
    return ans+go[uu];
}

int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n,s,q,e;cin>>n>>s>>q>>e;
    vector<pair<int,int>>v;
    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});
        v.push_back({a,b});
    }
    for(int i=1;i<=s;i++){
        int x;cin>>x;
        shop[x]=1;
    }
    dfs(e,0);
    efs(e,0,0);
    for(int i=0;i<q;i++){
        int id,st;cin>>id>>st;
        int x=max(make_pair(lv[v[id-1].first],v[id-1].first),make_pair(lv[v[id-1].second],v[id-1].second)).second;
        //cerr<<x<<" "<<st<<"\n";
        if(in[st]>=in[x]&&in[st]<=out[x]){
            int ans=fans(st,x);
            if(ans>=inf)cout<<"oo\n";
            else cout<<ans<<"\n";
        }else{
            cout<<"escaped\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...