Submission #836097

#TimeUsernameProblemLanguageResultExecution timeMemory
836097yeediotValley (BOI19_valley)C++14
0 / 100
91 ms46128 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define F first
#define S second
#define all(x) x.begin(),x.end()
#define pii pair<int,int>
#define pb push_back
#define sz(x) (int)(x.size())
#define chmin(x,y) x=min(x,y)
#define chmax(x,y) x=max(x,y)
#define vi vector<int>
#define vp vector<pii>
#define vvi vector<vi>
const int mxn=1e5+5;
struct edge{
    int v,u,d;
};
vector<edge>ed;
vector<pii>adj[mxn];
bool is_shop[mxn];
int dis[mxn];
int jump[20][mxn];
int mn[20][mxn];
int magic[mxn];
int dep[mxn];
int timer=0;
int in[mxn],out[mxn];
void calc_dis(int v,int pa){
    //cout<<v<<' ';
    jump[0][v]=pa;
    in[v]=timer;
    timer++;
    dep[v]=dep[pa]+1;
    for(auto u:adj[v]){
        if(u.F==pa)continue;
        dis[u.F]=u.S+dis[v];
        calc_dis(u.F,v);
        chmin(magic[v],magic[u.F]);
    }
    out[v]=timer;
    timer++;
}
void dfs(int v,int pa){
    if(is_shop[v])magic[v]=dis[v];
    else magic[v]=8e18;
    for(auto u:adj[v]){
        if(u.F==pa)continue;
        dfs(u.F,v);
        chmin(magic[v],magic[u.F]);
    }
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int n,s,q,e;
    cin>>n>>s>>q>>e;
    ed.pb({0,0,0});
    for(int i=1;i<n;i++){
        int v,u,d;
        cin>>v>>u>>d;
        ed.pb({v,u,d});
        adj[v].pb({u,d});
        adj[u].pb({v,d});
    }
    for(int i=0;i<s;i++){
        int x;
        cin>>x;
        is_shop[x]=1;
    }
    dis[e]=0;
    calc_dis(e,0);
    dfs(e,0);
    for(int i=1;i<=n;i++){
        magic[i]-=2*dis[i];
       // cout<<magic[i]<<' ';
    }
    for(int i=1;i<=n;i++){
        mn[0][i]=magic[jump[0][i]];
    }
    for(int i=1;i<20;i++){
        for(int j=1;j<=n;j++){
            jump[i][j]=jump[i-1][jump[i-1][j]];
            mn[i][j]=min(mn[i-1][j],mn[i-1][jump[i-1][j]]);
        }
    }
    while(q--){
        int id,p;
        cin>>id>>p;
        int top=(dep[ed[id].v]>dep[ed[id].u]?ed[id].v:ed[id].u);
        if(in[top]<=in[p] and out[top]>=out[p]){
            int dif=dep[p]-dep[top];
            int ans=magic[p];
            //cout<<magic[p]<<' '<<dis[p]<<' ';
            int x=dis[p];
            for(int i=0;i<20;i++){
                if(dif>>i&1){
                    chmin(ans,mn[i][p]);
                    p=jump[i][p];
                }
            }
            if(ans>=1e10)cout<<"oo\n";
            else cout<<x+ans<<'\n';
        }
        else{
            cout<<"esacped\n";
        }
    }
}
 /*
 input:
 
 */

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