Submission #1318373

#TimeUsernameProblemLanguageResultExecution timeMemory
1318373wangzhiyi33Valley (BOI19_valley)C++20
100 / 100
214 ms48956 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#pragma GCC optimize("O3,unroll-loops")
#define ii pair<int,int>
#define fir first
#define sec second
#define pb push_back
const int maxn=1e5;

int n,s,qu,st;
int bin[maxn+2][20],mn[maxn+2][20];
int dep[maxn+2],dp[maxn+2],dist[maxn+2];
vector<pair<int,int> >adj[maxn+2];
bool shop[maxn+2];

void dfs(int cur,int par,int jrk){
    dp[cur]=1e18;
    dep[cur]=dep[par]+1; bin[cur][0]=par;
    dist[cur]=jrk;

    if(shop[cur]){
        dp[cur]=dist[cur];
    }

    for(auto [nxt,we] : adj[cur]){
        if(par==nxt)continue;
        dfs(nxt,cur,jrk+we);
        dp[cur]=min(dp[cur],dp[nxt]);
    }
    for(auto [nxt,we] : adj[cur]){
        if(par==nxt)continue;
       // mn[nxt][0]=min(mn[nxt][0],dp[cur]-2*dist[cur]);
    }

    mn[cur][0]=1e18;
    if(dp[cur]<1e18){
        mn[cur][0]=min(mn[cur][0],dp[cur]-2*dist[cur]);
    }
}

int lca(int u,int v){
    if(dep[u]<dep[v])swap(u,v);
    int slsh=dep[u]-dep[v];

    for(int q=19;q>=0;q--){
        if(slsh>=(1<<q)){
            u=bin[u][q];
            slsh-=(1<<q);
        }
    }

    if(u==v)return u;
    for(int q=19;q>=0;q--){
        if(bin[u][q]!=bin[v][q]){
            u=bin[u][q],v=bin[v][q];
        }
    }
    return bin[u][0];
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>s>>qu>>st;
    ii edge[n+1];

    for(int q=1;q<n;q++){
        int u,v,w;
        cin>>u>>v>>w;
        adj[u].pb({v,w});
        adj[v].pb({u,w});
        edge[q]={u,v};
    }
    for(int q=1;q<=s;q++){
        int x; cin>>x;
        shop[x]=true;
    }

    dfs(st,0,0);
    
    for(int q=1;q<=19;q++){
        for(int w=1;w<=n;w++){
            bin[w][q]=bin[bin[w][q-1]][q-1];
            mn[w][q]=min(mn[w][q-1],mn[bin[w][q-1]][q-1]);
        }
    }
    

    while(qu--){
        int jln,cur;
        cin>>jln>>cur;
        int idx=edge[jln].fir;
        if(dep[edge[jln].fir]<dep[edge[jln].sec]){
            idx=edge[jln].sec;
        }

        if(lca(idx,cur)!=idx){
            cout<<"escaped"<<endl;
            continue;
        }
        int ans=1e18;
        int slsh=dep[cur]-dep[idx]+1;
        int u=cur;

        for(int q=19;q>=0;q--){
            if(slsh>=(1<<q)){
                int cost=mn[u][q]+dist[cur];
                //cout<<u<<" "<<q<<" "<<mn[u][q]<<endl;
                ans=min(ans,cost);

                u=bin[u][q];
                slsh-=(1<<q);
            }
        }
        

        if(ans==1e18){
            cout<<"oo"<<endl;
        }
        else{
            cout<<ans<<endl;
        }
    }


}   
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...