Submission #1209504

#TimeUsernameProblemLanguageResultExecution timeMemory
1209504vaneaValley (BOI19_valley)C++20
59 / 100
3005 ms23036 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const int mxN = 1e5+10;
const ll INF = 1e18;

vector<array<int, 2>> adj[mxN];
int anc[mxN][20], sub_esc[mxN], d[mxN];
ll dist[mxN];
bool sp[mxN];

void jmp(int &x, int dist) {
    for(int k = 19; k >= 0; k--) {
        if(dist & (1 << k)) x = anc[x][k];
    }
}

int lca(int a, int b) {
    if(d[b] > d[a]) swap(a, b);
    jmp(a, d[a]-d[b]);
    if(a == b) return a;
    for(int k = 19; k >= 0; k--) {
        if(anc[a][k] != anc[b][k]) {
            a = anc[a][k];
            b = anc[b][k];
        }
    }
    return anc[a][0];
}

void dfs(int node, int p, int e) {
    anc[node][0] = p;
    for(int k = 1; k <= 19; k++) {
        anc[node][k] = anc[anc[node][k-1]][k-1];
    }
    for(auto [it, w] : adj[node]) {
        if(it == p) continue;
        d[it] = d[node]+1;
        dist[it] = dist[node] + w;
        dfs(it, node, e);
        sub_esc[node] |= sub_esc[it];
    }
    if(node == e) sub_esc[node] = 1;
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, s, q, e;
    cin >> n >> s >> q >> e;
    vector<array<int, 3>> queries;
    for(int i = 1; i < n; i++) {
        int a, b, w;
        cin >> a >> b >> w;
        adj[a].push_back({b, w});
        adj[b].push_back({a, w});
        queries.push_back({a, b, w});
    }
    for(int i = 0; i < s; i++) {
        int k;
        cin >> k;
        sp[k] = true;
    }
    dfs(1, 0, e);
    while(q--) {
        int idx; int k;
        cin >> idx >> k; --idx;
        int a = queries[idx][0], b = queries[idx][1];
        if(d[b] < d[a]) swap(a, b);
        bool fnd = true;
        if(d[k] >= d[b]) {
            int anc1 = lca(b, k);
            if(sub_esc[b] && anc1 != b) {
                fnd = false;
            }
            else if(!sub_esc[b] && anc1 == b) {
                fnd = false;
            }
            else {
                cout << "escaped\n";
            }
        }
        else {
            if(sub_esc[b]) {
                fnd = false;
            }
            else {
                cout << "escaped\n";
            }
        }
        if(fnd) continue;
        if(s == n) {
            cout << 0 << '\n';
            continue;
        }
        ll mn = INF;
        int anc1 = lca(b, k);
        for(int i = 1; i <= n; i++) {
            if(sp[i]) {
                int anc2 = lca(i, b);
                int anc3 = lca(i, k);
                if(anc2 == b && anc1 == b) {
                    mn = min(mn, dist[k] + dist[i] - 2*dist[anc3]);
                }
                else if(anc2 != b && anc1 != b) {
                    mn = min(mn, dist[k] + dist[i] - 2*dist[anc3]);
                }
            }
        }
        if(mn == INF) cout << "oo\n";
        else cout << mn << '\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...