Submission #1240232

#TimeUsernameProblemLanguageResultExecution timeMemory
1240232sh1ftValley (BOI19_valley)C++17
100 / 100
244 ms38884 KiB
#include <bits/stdc++.h>
#define ll long long

using namespace std;

const int mxN = 1e5+5, mxL = 20;

int N, S, Q, E, up[mxL][mxN], dep[mxN];
bool shp[mxN];
ll dis[mxN], dp[mxN], mup[mxL][mxN];
vector <pair <int, ll>> adj[mxN];
pair <int, int> EDGE[mxN];

ll dfs(int u, int p) {
    ll mn = LLONG_MAX;
    if (shp[u]) mn = dis[u];
    for (auto [v, w] : adj[u]) if (v != p) {
        dis[v] = dis[u] + w;
        dep[v] = dep[u] + 1;
        up[0][v] = u;
        mn = min(mn, dfs(v, u));
    }
    if (mn < LLONG_MAX) dp[u] = -2*dis[u] + mn;
    else dp[u] = LLONG_MAX;
    mup[0][u] = dp[u];
    return mn;
}

int main() {
    cin >> N >> S >> Q >> E;
    for (int i = 1; i < N; i++) { int u, v; ll w; cin >> u >> v >> w; adj[u].emplace_back(v, w), adj[v].emplace_back(u, w); EDGE[i] = make_pair(u, v); }
    for (int i = 0; i < S; i++) { int x; cin >> x; shp[x] = 1; }
    dep[E] = 1;
    dfs(E, E);
    for (int c = 1; c < mxL; c++) for (int i = 1; i <= N; i++) {
        up[c][i] = up[c-1][up[c-1][i]];
        mup[c][i] = min(mup[c-1][i], mup[c-1][up[c-1][i]]);
    }
    while (Q--) {
        int idx, x, p; cin >> idx >> x;
        if (dep[EDGE[idx].first] < dep[EDGE[idx].second]) p = EDGE[idx].second;
        else p = EDGE[idx].first;
        int t = x, k = dep[t] - dep[p];
        if (k < 0) { cout << "escaped\n"; continue; }
        for (int i = 0; i < mxL; i++) if (k & (1 << i)) t = up[i][t];
        if (t != p) { cout << "escaped\n"; continue; }
        t = x; k++;
        ll mn = LLONG_MAX;
        for (int i = 0; i < mxL; i++) if (k & (1 << i)) mn = min(mn, mup[i][t]), t = up[i][t];
        if (mn == LLONG_MAX) { cout << "oo\n"; continue; }
        cout << dis[x] + mn << '\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...