Submission #1192533

#TimeUsernameProblemLanguageResultExecution timeMemory
1192533NewtonabcValley (BOI19_valley)C++20
23 / 100
107 ms21308 KiB
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int M=1<<18;
vector<pair<int,long long>> adj[N];
int ti,in[N],out[N],pa[N],dep[N],top[N],sz[N];
bool sh[N];
//distance from root, constant c[x]=min(d[shop])-2*d[x], dp[i]=minimum distance from root to shop in subtree of node i
long long d[N],c[N],dp[N],s[M];
pair<int,int> edge[N];
void build(int l,int r,int idx){
    s[idx]=LLONG_MAX;
    if(l==r) return;
    int m=(l+r)/2;
    build(l,m,idx*2);
    build(m+1,r,idx*2+1);
}
void update(int l,int r,int idx,int a,int b){
    if(a<l || a>r) return;
    if(l==r){
        s[idx]=b;
        return;
    }
    int m=(l+r)/2;
    update(l,m,idx*2,a,b);
    update(m+1,r,idx*2+1,a,b);
    s[idx]=min(s[idx*2],s[idx*2+1]);
}
long long query(int l,int r,int idx,int a,int b){
    if(b<l || a>r) return LLONG_MAX;
    if(a<=l && b>=r) return s[idx];
    int m=(l+r)/2;
    return min(query(l,m,idx*2,a,b),query(m+1,r,idx*2+1,a,b));
}
void findsz(int u,int p=0){
    sz[u]=1;
    int tmp=sz[p];
    sz[p]=0;
    for(int i=0;i<adj[u].size();i++){
        auto [v,w]=adj[u][i];
        if(v==p) continue;
        dep[v]=dep[u]+1;
        findsz(v,u);
        sz[u]+=sz[v];
        if(sz[v]>sz[adj[u][0].first]) swap(adj[u][i],adj[u][0]);
    }
    sz[p]=tmp;
}
void dfs(int u,int p=-1){
    in[u]=++ti;
    for(auto [v,w]:adj[u]){
        if(v==p) continue;
        pa[v]=u;
        d[v]=d[u]+w;
        dfs(v,u);
        if(v==adj[u][0].first) top[v]=top[u];
        else top[v]=v;
    }
    out[u]=ti;
}
void efs(int u,int p=-1){
    if(sh[u]) dp[u]=d[u];
    else dp[u]=LLONG_MAX;
    for(auto [v,w]:adj[u]){
        if(v==p) continue;
        efs(v,u);
        if(dp[v]!=LLONG_MAX) dp[u]=min(dp[u],dp[v]);
    }
}
long long path(int u,int v){
    long long ans=LLONG_MAX;
    while(top[u]!=top[v]){
        if(dep[top[u]]>dep[top[v]]) swap(u,v);
        ans=min(ans,query(1,ti,1,in[top[v]],in[v]));
        v=pa[top[v]];
    }
    if(dep[u]>dep[v]) swap(u,v);
    ans=min(ans,query(1,ti,1,in[u],in[v]));
    return ans;
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n,s,q,e;
    cin>>n >>s >>q >>e;
    for(int i=0;i<n-1;i++){
        int a,b;
        long long c;
        cin>>a >>b >>c;
        adj[a].push_back({b,c});
        adj[b].push_back({a,c});
        edge[i+1]={a,b};
    }
    for(int i=0;i<s;i++){
        int inp;
        cin>>inp;
        sh[inp]=true;
    }
    findsz(e);
    dfs(e);
    efs(e);
    // for(int i=1;i<=n;i++) cout<<sh[i] <<" ";
    // cout<<"\n";
    // for(int i=1;i<=n;i++) cout<<dp[i] <<" ";
    // cout<<"\n";
    build(1,ti,1);
    for(int i=1;i<=n;i++){
        if(dp[i]!=LLONG_MAX) c[i]=dp[i]-2LL*d[i];
        else c[i]=LLONG_MAX;
        update(1,ti,1,in[i],c[i]);
    }
    while(q--){
        int clo,f;
        cin>>clo >>f;
        auto [hi,lo]=edge[clo];
        if(pa[lo]!=hi) swap(lo,hi);
        if(!(in[f]>=in[lo] && out[f]<=out[lo])){
            cout<<"escaped\n";
            continue;
        }
        if(dp[lo]==LLONG_MAX){
            cout<<"oo\n";
            continue;
        }
        long long ans=d[f]+path(lo,f);
        cout<<0 <<"\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...