Submission #1149399

#TimeUsernameProblemLanguageResultExecution timeMemory
1149399dostsValley (BOI19_valley)C++17
100 / 100
157 ms64800 KiB
#include <bits/stdc++.h>
#pragma GCC target("avx2")
#pragma GCC optimize("O3,unroll-loops")
using namespace std;
#define int long long
#define pii pair<int,int>
#define ff first
#define ss second
#define sp << " " <<    
#define all(cont) cont.begin(),cont.end()
#define vi vector<int>

const int inf = 1e18,N = 3e5+1,MOD = 998244353,BL = 1000;

vector<pii> edges[N];
vi d(N),tin(N),tout(N),shop(N,0),f(N);
int timer = 1;
int up[N][20];
int opt[N][20];
void dfs(int node,int p) {
    up[node][0] = p;
    for (int i=1;i<20;i++) up[node][i] = up[up[node][i-1]][i-1];
    tin[node] = timer++;
    if (node == p) d[node] = 0;
    for (auto it : edges[node]) {
        if (it.ff == p) continue;
        d[it.ff] = d[node]+it.ss;
        dfs(it.ff,node);
    }
    tout[node] = timer-1;
    if (!shop[node]) {
        shop[node] = inf;
        for (auto it : edges[node]) {
            if (it.ff == p) continue;
            shop[node] = min(shop[node],shop[it.ff]);
        }
    }
    else shop[node] = d[node];
    f[node] = shop[node]-2*d[node];
} 

bool anc(int a,int b) {
    return tin[a] <= tin[b] && tout[a] >= tout[b];
}

void solve() { 
    int n,s,q,e;
    cin >> n >> s >> q >> e;
    vector<pii> edg(n);
    for (int i=1;i<n;i++) {
        int a,b,c;
        cin >> a >> b >> c;
        edg[i] = {a,b};
        edges[a].push_back({b,c});
        edges[b].push_back({a,c});
    }
    for (int i=1;i<=s;i++) {
        int p;
        cin >> p;
        shop[p] = 1;
    }
    dfs(e,e);
    for (int i=1;i<=n;i++) opt[i][0] = f[i];
    for (int j = 1;j<20;j++) {
        for (int i=1;i<=n;i++) {
            opt[i][j] = min(opt[i][j-1],opt[up[i][j-1]][j-1]);
        }
    }
    while (q--) {
        int block,node;
        cin >> block >> node;
        int v = node;
        if (anc(edg[block].ff,edg[block].ss)) swap(edg[block].ff,edg[block].ss);
        if (!anc(edg[block].ff,node)) {
            cout << "escaped\n";
            continue;
        }
        int ans = f[node];
        for (int i = 19;i>=0;i--) {
            if (!anc(up[node][i],edg[block].ss)) {
                ans = min(ans,opt[node][i]);
                node = up[node][i];
            }
        }
        ans = min(ans,opt[node][0]);
        if (ans >= 1e17) cout << "oo\n";
        else cout << d[v]+ans << '\n';
    }
}

int32_t main() { 
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    #ifdef Dodi 
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
    #endif
    int t = 1;
    //cin >> t;
    while (t --> 0) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...