Submission #877236

#TimeUsernameProblemLanguageResultExecution timeMemory
877236vjudge1Valley (BOI19_valley)C++17
100 / 100
213 ms49164 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using piii = array<int, 3>;

#define pb push_back

const int LG = 18 + 2, N = 1e5 + 4;
const ll D = 1e15, INF = 1ll << 62;

struct Info {
    int anc;
    ll cost;
    Info () {
        anc = -1, cost = INF;
    }
} info[N][LG];

int n, s, q, e, down[N], h[N];
ll mnd[N], d[N];
bool shop[N];
vector<piii> g[N];

void dfs(int v = e) {    
    if (v != e) {
        for (int i = 1; i < LG; i++) {
            int u = info[v][i - 1].anc;
            if (u != -1)
                info[v][i].anc = info[u][i - 1].anc;
        }
    }

    for (auto [u, w, idx] : g[v]) {
        if (u != info[v][0].anc) {
            d[u] = d[v] + w;
            h[u] = h[v] +  1;
            down[idx] = u;
            info[u][0].anc = v;
            dfs(u);
            mnd[v] = min(mnd[v], mnd[u]);
        }
    }
    if (shop[v])
        mnd[v] = d[v];
}

void calcCost(int v = e) {
    info[v][0].cost = mnd[v] - (d[v] << 1);
    for (int i = 1; i < LG; i++) {
        int u = info[v][i - 1].anc;
        ll tmp = info[v][i - 1].cost;
        if (u != -1)
            tmp = min(tmp, info[u][i - 1].cost);
        info[v][i].cost = tmp;
    }

    for (auto [u, w, idx] : g[v]) 
        if (u != info[v][0].anc)
            calcCost(u);
}

int up(int v, int cnt) {
    for (int i = 0; i < LG; i++) 
        if (((1 << i) & cnt) && v != -1)
            v = info[v][i].anc;
    return v;
}

ll getMin(int v, int cnt) {
    ll ret = INF;
    for (int i = 0; i < LG; i++) {
        if (((1 << i) & cnt) && v != -1) {
            ret = min(ret, info[v][i].cost);
            v = info[v][i].anc;
        }
    }
    return ret;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> n >> s >> q >> e;
    for (int i = 0; i < n - 1; i++) {
        int v, u, w;
        cin >> v >> u >> w;
        v--, u--;
        g[v].pb({u, w, i});
        g[u].pb({v, w, i});
    }
    for (int i = 0; i < s; i++) {
        int v;
        cin >> v;
        v--;
        shop[v] = 1;
    }
    for (int i = 0; i < n; i++) 
        mnd[i] = INF;

    e--;
    dfs();
    calcCost();

    while (q--) {
        int edge, v;
        cin >> edge >> v;
        edge--, v--;
        int u = down[edge];

        int difh = h[v] - h[u];
        if (difh < 0 || up(v, difh) != u) 
            cout << "escaped";
        else {
            ll ans = getMin(v, difh + 1) + d[v];
            if (ans > D)
                cout << "oo";
            else
                cout << ans;
        }
        cout << '\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...