제출 #1282187

#제출 시각아이디문제언어결과실행 시간메모리
1282187hanguyendanghuyValley (BOI19_valley)C++20
59 / 100
3066 ms21840 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define fi first
#define se second
const ll MAXN = 4e5 + 5, INF = 1e18, MOD = 1e9 + 7, MAXV = 4e5 + 2;
ll n, m, i, j, k, p, dem, cnt, ans, S, Q, root, dtr[MAXN], shop[MAXN], mark[MAXN], preshop[MAXN], par[MAXN], dist[MAXN], chain[MAXN], headchain[MAXN], st[MAXN], en[MAXN], cntchain = 1, de[MAXN], sz[MAXN];
vector<pair<ll, ll>> adj[MAXN];
pair<ll, ll> edge[MAXN];

ll dfs(ll st) {
    sz[st] = 1;
    if (shop[st] & 1) preshop[st] = st;
    ll best = INF;
    for (auto x : adj[st]) {
        if (de[x.fi]) continue;
        de[x.fi] = de[st] + 1;
        dtr[x.fi] = dtr[st] + x.se;
        par[x.fi] = st;
        preshop[x.fi] = preshop[st];
        best = min(best, dfs(x.fi) + x.se);
        sz[st] += sz[x.fi];
    }
    if (shop[st] & 1) best = 0;
    dist[st] = best;
    return best;
}

void HLD(ll u) {
    if (!headchain[cntchain]) headchain[cntchain] = u;
    chain[u] = cntchain;
    ll v = -1, maxsz = -1;
    for (auto x : adj[u])
        if (x.fi != par[u] && sz[x.fi] > maxsz) maxsz = sz[x.fi], v = x.fi;
    if (v != -1) HLD(v);
    for (auto x : adj[u])
        if (x.fi != par[u] && x.fi != v) {
            ++cntchain;
            HLD(x.fi);
        }
    en[u] = cntchain;
}

ll lca(ll u, ll v) {
    while (chain[u] != chain[v]) {
        if (de[headchain[chain[u]]] > de[headchain[chain[v]]])
            u = par[headchain[chain[u]]];
        else
            v = par[headchain[chain[v]]];
    }
    return (de[u] < de[v] ? u : v);
}

ll tinh(ll u, ll v) {
    return de[u] + de[v] - 2 * de[lca(u, v)];
}

void check(ll u, ll st) {
    ll stchain = chain[u], enchain = en[u], cur = preshop[st];
    if (cur > 0 && de[cur] >= de[u]) ans = min(ans, dtr[st] - dtr[cur]);
    for (ll i = stchain; i <= enchain; i++) {
        ll pa = par[headchain[i]];
        if (!pa || de[pa] < de[u]) continue;
        ans = min(ans, dist[pa] + dtr[pa] + dtr[st] - 2 * dtr[lca(st, pa)]);
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> S >> Q >> root;
    for (i = 1; i < n; i++) {
        ll u, v, c;
        cin >> u >> v >> c;
        edge[i] = {u, v};
        adj[u].pb({v, c});
        adj[v].pb({u, c});
    }
    for (i = 1; i <= S; i++) cin >> k, shop[k] = 1;
    de[root] = 1;
    fill(dist + 1, dist + n + 1, INF);
    dfs(root);
    HLD(root);
    for (i = 1; i <= Q; i++) {
        ll block, E;
        cin >> block >> E;
        ll u = edge[block].fi, v = edge[block].se;
        if (de[u] < de[v]) swap(u, v);
        ans = INF;
        if (tinh(u, E) + tinh(v, root) + 1 == tinh(E, root)) {
            ans = min(ans, dist[E]);
            ans = min(ans, dist[u] - dtr[u] + dtr[E]);
            check(u, E);
            if (ans >= INF)
                cout << "oo\n";
            else
                cout << ans << '\n';
        } else
            cout << "escaped\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...