Submission #393634

#TimeUsernameProblemLanguageResultExecution timeMemory
393634inventiontimeValley (BOI19_valley)C++17
36 / 100
3074 ms69548 KiB
#include <bits/stdc++.h>
using namespace std;

#define ff first
#define ss second
#define pb push_back

#define int ll

typedef long long ll;
typedef pair<int, int> ii;

typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<ll> vll;

const ll maxn = 1e5 + 5;
const ll inf = LLONG_MAX/2;

int N, S, Q, E;
ii road[maxn];
vii adj[maxn];
set<int> shop;
vi tin(maxn);
vi tout(maxn);
vll dist(maxn, inf);
int par[maxn][20];
ll par_w[maxn][20];
ll par_s[maxn][20];
int cnt = 0;

void dfs(int u) {
    tin[u] = cnt; cnt++;

    for(auto [v, w] : adj[u]) if(v != par[u][0]) {
        par[v][0] = u;
        par_w[v][0] = w;
        dfs(v);
        dist[u] = min(dist[u], dist[v] + w);
    }

    if(shop.count(u)) dist[u] = 0;

    tout[u] = cnt; cnt++;
}

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

void lifting() {
    for(int j = 1; j <= N; j++) {
        par_s[j][0] = min(par_w[j][0] + dist[par[j][0]], dist[j]);
    }

    for(int i = 1; i <= 19; i++) for(int j = 1; j <= N; j++) {
        par[j][i] = par[par[j][i-1]][i-1];
        par_w[j][i] = par_w[par[j][i-1]][i-1] + par_w[j][i-1];
        par_s[j][i] = par_w[j][i] + dist[par[j][i]];
        par_s[j][i] = min(min(par_s[j][i], par_s[j][i-1]), par_s[par[j][i-1]][i-1] + par_w[j][i-1]);
    }
}

int32_t main() {
    cin >> N >> S >> Q >> E;

    int u, v, w;
    for(int i = 1; i < N; i++) {
        cin >> u >> v >> w;
        road[i] = {u, v};
        adj[u].pb({v, w});
        adj[v].pb({u, w});
    }

    for(int i = 0; i < S; i++) {
        cin >> v; shop.insert(v);
    }

    par[E][0] = 0;
    par_w[E][0] = 0;
    dfs(E);

    lifting();

    int I, R, top;
    ll res;
    while(Q--) {
        cin >> R >> I;
        auto [u, v] = road[R];
        if(is_anc(I, u) && is_anc(I, v)) {
            top = (is_anc(u, v) ? u : v);
            int x = I;
            ll wt = 0;
            res = inf;
            
            /*for(int i = 19; i >= 0; i--) if(is_anc(par[x][i], top)) {
                res = min(res, par_s[x][i] + wt);
                x = par[x][i];
                wt += par_w[x][i];
            }*/
            res = dist[x];
            while(x != top) {
                wt += par_w[x][0];
                x = par[x][0];
                res = min(res, dist[x] + wt);
            }

            if(res < inf) cout << res << endl;
            else cout << "oo" << endl;
        } else {
            cout << "escaped" << endl;
        }
    }

    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...