Submission #1036823

#TimeUsernameProblemLanguageResultExecution timeMemory
1036823trucmaiValley (BOI19_valley)C++17
100 / 100
182 ms75188 KiB
#include <bits/stdc++.h>
#ifdef LOCAL
    #include "/home/trcmai/code/tools.h"
    #define debug(x...) cerr << "\e[91m"<<__func__<<":"<<__LINE__<<" [" << #x << "] = ["; _print(x); cerr << "\e[39m" << endl;
#else
    #define debug(x...)
#endif
using namespace std;
#define all(a) a.begin(), a.end()
#define ll long long
#define endl '\n'
const int N = 1e6 + 6, LOG = 27, MOD = 1e9 + 7;
const ll INF = 1e18;
int n,s,q,root;
vector<pair<int,ll>>g[N];
bool shop[N];
ll dep[N],mn[N],dp[N][LOG]; 
int h[N],tin[N],tout[N],up[N][LOG];

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    auto solver=[&](){
        cin>>n>>s>>q>>root;
        vector<tuple<int,int,ll>>edge(n + 1);
        for(int i = 1;i < n;++i){
            int u,v; ll w; 
            cin>>u>>v>>w; 
            g[u].emplace_back(v,w);
            g[v].emplace_back(u,w);
            edge[i] = {u,v,w};
        }
        fill(mn + 1,mn + n + 1,INF);
        for(int i = 1;i <= s;++i){
            int ver; cin>>ver; 
            mn[ver] = 0;
        }
        auto dfs1=[&](auto &&self,int u,int p)->void{
            for(auto &[v,w] : g[u]){
                if(v == p) continue;
                self(self,v,u);
                mn[u] = min(mn[u],mn[v] + w);
            }
        };
        int timer = 0;
        auto dfs2=[&](auto &&self,int u,int p)->void{
            tin[u] = ++timer;
            for(auto &[v,w] : g[u]){
                if(v == p) continue;
                dep[v] = dep[u] + w; 
                h[v] = h[u] + 1;
                up[v][0] = u;
                dp[v][0] = mn[u] - dep[u];
                for(int i = 1;i < LOG;++i){
                    up[v][i] = up[up[v][i-1]][i-1];
                    dp[v][i] = min(dp[v][i-1],dp[up[v][i-1]][i-1]);
                }
                self(self,v,u);
            }
            tout[u] = timer;
        };
        auto lift=[&](int u,int anc){
            int k = h[u] - h[anc];
            ll res = mn[u] - dep[u];
            for(int i = 0;i < LOG;++i){
                if(k>>i&1){
                    res = min(res,dp[u][i]);
                    u = up[u][i];
                }
            }
            return res;
        };
        dfs1(dfs1,root,0);
        dfs2(dfs2,root,0);
        while(q--){
            int idx,vert; cin>>idx>>vert;
            auto [u,v,w] = edge[idx];
            if(v == up[u][0]) swap(u,v);
            if(!(tin[v] <= tin[vert] && tout[v] >= tout[vert])){
                cout<<"escaped"<<endl;
                continue;
            }
            ll dist = lift(vert,v) + dep[vert];
            if(dist >= 1e14) cout<<"oo"<<endl;
            else cout<<dist<<endl;
        }
    };
    int t = 1; // cin>>t;
    while (t--) solver();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...