Submission #1105074

#TimeUsernameProblemLanguageResultExecution timeMemory
1105074doducanhValley (BOI19_valley)C++14
100 / 100
115 ms60088 KiB
///breaker
#pragma GCC optimize("O2")
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
#define fi first
#define se second
#define ii pair<int,int>
#define mp make_pair
#define in(x) freopen(x,"r",stdin)
#define out(x) freopen(x,"w",stdout)
#define bit(x,i) ((x>>i)&1)
#define lc (id<<1)
#define rc ((id<<1)^1)
const int maxn=1e5+7;
const int inf=1e18+7;
vector<ii>adj[maxn];
bool dd[maxn];
int d1[maxn];
int d2[maxn];
int h[maxn];
int n,s,q,H;
int minn[25][maxn];
int cnt=0;
int in[maxn],out[maxn];
int p[25][maxn];
vector<ii>edges;
void dfs(int u,int par)
{
    if(dd[u])d1[u]=0;
    in[u]=++cnt;
    for(ii pp:adj[u]){
        int v=pp.fi,w=pp.se;
        if(v==par)continue;
        h[v]=h[u]+1;
        d2[v]=d2[u]+w;
        p[0][v]=u;
        dfs(v,u);
        d1[u]=min(d1[u],d1[v]+w);
    }
    out[u]=++cnt;
}
bool check(int u,int v)
{
    return (in[u]<=in[v]&&out[v]<=out[u]);
}
void sol(void){
    cin>>n>>s>>q>>H;
    for(int i=0;i<=n;i++){
        d1[i]=inf;
        d2[i]=0;
    }
    edges.push_back({0,0});
    for(int i=1;i<n;i++){
        int u,v,w;
        cin>>u>>v>>w;
        adj[u].push_back({v,w});
        adj[v].push_back({u,w});
        edges.push_back({u,v});
    }
    for(int i=1;i<=s;i++){
        int u;
        cin>>u;
        dd[u]=1;
    }
    dfs(H,0);
    for(int i=1;i<=n;i++){
        minn[0][i]=-d2[p[0][i]]+d1[p[0][i]];
    }
    for(int i=1;i<=20;i++){
        for(int j=1;j<=n;j++){
            minn[i][j]=min(minn[i-1][j],minn[i-1][p[i-1][j]]);
            p[i][j]=p[i-1][p[i-1][j]];
        }
    }
    while(q--){
        int id,r;
        cin>>id>>r;
        int u=edges[id].fi,v=edges[id].se;
        if(h[u]<h[v])swap(u,v);
        if(!(check(u,r)&&check(v,r))){
            cout<<"escaped"<<"\n";
            continue;
        }
        int ans=-d2[r]+d1[r];
        int del=h[r]-h[u];
        int pre=r;
        for(int i=20;i>=0;i--)if(bit(del,i)){
            ans=min(ans,minn[i][r]);
            r=p[i][r];
        }
        if(ans+d2[pre]>=inf){
            cout<<"oo"<<"\n";
            continue;
        }
        cout<<ans+d2[pre]<<"\n";
    }
}
signed main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t=1;
    while(t--){
        sol();
    }
    // you should actually read the stuff at the bottom
    return 0;
}
/* stuff you should look for
 * int overflow, array bounds
 * special cases (n=1?)
 * do smth instead of nothing and stay organized
 * WRITE STUFF DOWN
 * DON'T GET STUCK ON ONE APPROACH
 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...