Submission #1194155

#TimeUsernameProblemLanguageResultExecution timeMemory
1194155Hamed_GhaffariValley (BOI19_valley)C++20
23 / 100
107 ms38412 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using pii = pair<int, int>;

#define X first
#define Y second

const int MXN = 1e5+5;
const int LOG = 17;
const ll inf = 1e18;

int par[MXN][LOG], W[MXN], n, down[MXN];
vector<pii> g[MXN];
bool shop[MXN];
ll dp[MXN], mn[MXN][LOG], h[MXN];
int stt[MXN], fnt[MXN], timer;

void dfs1(int v) {
    for(int i=1; i<LOG; i++)
        par[v][i] = par[par[v][i-1]][i-1];
    stt[v] = timer++;
    dp[v] = shop[v] ? 0 : inf;
    for(auto [u, id] : g[v])
        if(u!=par[v][0]) {
            par[u][0] = v;
            h[u] = h[v]+W[id];
            down[id] = u;
            dfs1(u);
            dp[v] = min(dp[v], dp[u]+W[id]);
        }
    fnt[v] = timer++;
}

inline bool is_anc(int u, int v) {
    return stt[u] <= stt[v] && fnt[v] <= fnt[u];
}

vector<pii> Q[MXN];

inline void upd(int v, ll x) {
    mn[v][0] = x;
    for(int i=1; i<LOG; i++)
        mn[v][i] = min(mn[v][i-1], mn[par[v][i-1]][i-1]);
}

inline ll get(int v, int d) {
    ll res = inf;
    for(int i=0; i<LOG; i++)
        if(d>>i&1)
            res = min(res, mn[v][i]),
            v = par[v][i];
    return res;
}

ll ans[MXN];

void dfs2(int v) {
    upd(v, dp[v]-h[v]);
    for(auto [e, id] : Q[v])
        ans[id] = get(v, h[v]-h[down[e]]+1)+h[v];
    if(shop[v]) {
        upd(v, -h[v]);
        for(auto [u, id] : g[v])
            if(u!=par[v][0])
                dfs2(u);
    }
    else {
        ll mn1 = 2*inf, mn2 = 2*inf;
        for(auto [u, id] : g[v])
            if(u!=par[v][0]) {
                ll val = dp[u] + W[id];
                if(val<mn2) mn2 = val;
                if(mn2<mn1) swap(mn1, mn2);
            }
        for(auto [u, id] : g[v])
            if(u!=par[v][0]) {
                if(dp[u] + W[id] == mn1) upd(v, mn2 - h[v]);
                else upd(v, mn1 - h[v]);
                dfs2(u);
            }
    }
}

int32_t main() {
    cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
    int s, e, q;
    cin >> n >> s >> q >> e;
    for(int i=0, u,v,w; i<n-1; i++) {
        cin >> u >> v >> w;
        g[u].push_back({v, i+1});
        g[v].push_back({u, i+1});
        W[i+1] = w;
    }
    for(int i=0, c; i<s; i++) {
        cin >> c;
        shop[c] = 1;
    }
    dfs1(e);
    for(int i=0; i<q; i++) {
        int e, r;
        cin >> e >> r;
        if(is_anc(down[e], r))
            Q[r].push_back({e, i});
        else
            ans[i] = -1;
    }
    dfs2(e);
    for(int i=0; i<q; i++)
        if(ans[i]==-1) cout << "escaped\n";
        else if(ans[i]>=inf/10) cout << "oo\n";
        else cout << ans[i] << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...