제출 #529319

#제출 시각아이디문제언어결과실행 시간메모리
529319OttoTheDinoValley (BOI19_valley)C++17
0 / 100
3046 ms21928 KiB
#include <bits/stdc++.h>
using namespace std;

#define rep(i,s,e)                  for (ll i = s; i <= e; ++i)
#define rrep(i,s,e)                 for (ll i = s; i >= e; --i)
#define pb                          push_back
#define pf                          push_front
#define fi                          first
#define se                          second
#define all(a)                      a.begin(), a.end()
typedef long long ll;
typedef pair<ll, ll> ii;
typedef vector<ii> vii;
typedef vector<ll> vi;
typedef vector<double> vd;
typedef vector<string> vs;
typedef vector<ll> vll;

const ll mx = 1e5;
const ll inf = 5e18;
ll d[mx+1], ans[mx+1], sp[mx+1];
vi a;
vii qs[mx+1], adj[mx+1];
ii roads[mx+1];
ll b[mx+1], seg[4*mx+1];

void upd (ll x, ll val, ll l, ll r, ll id) {
    if (l==r) {
        seg[id] = val;
        return;
    }
    
    ll mid = (l+r)/2;
    if (x<=mid) upd (x, val, l, mid, 2*id);
    else upd (x, val, mid+1, r, 2*id+1);

    seg[id] = min(seg[2*id], seg[2*id+1]);
}

ll query (ll l, ll r, ll bl, ll br, ll id) {
    if (l==bl && r==br) return seg[id];
    ll mid = (bl+br)/2;
    if (r<=mid) return query(l, r, bl, mid, 2*id);
    else if (l>mid) return query (l, r, mid+1, br, 2*id+1);
    return min(query (l, mid, bl, mid, 2*id), query(mid+1, r, mid+1, br, 2*id+1));
}

void dfs (ll u, ll p) {
    if (!sp[u]) b[u] = inf;
    for (ii vw : adj[u]) {
        ll v = vw.fi, w = vw.se;
        if (v==p) continue;
        d[v] = d[u]+1;
        dfs (v, u);
        if (b[v]<inf) b[u] = min(b[u], b[v]+w);
    }
}

void dfs2 (ll u, ll p, ll D) {
    a.pb(u);
    if (b[u]==inf) upd (a.size()-1, inf, 1, mx, 1);
    else upd (a.size()-1, b[u]-D, 1, mx, 1);

    for (ii q : qs[u]) {
        ll i = q.fi, id = q.se;
        if (a[d[roads[i].fi]]==roads[i].fi && a[d[roads[i].se]]==roads[i].se) {
            ll res = query (max(d[roads[i].fi], d[roads[i].se]), d[u], 1, mx, 1);


            if (res==inf) ans[id] = -2;
            else ans[id] = res+D;
        }
        else ans[id] = -1;
    }

    for (ii vw : adj[u]) {
        ll v = vw.fi, w = vw.se;
        if (v==p) continue;
        dfs2 (v, u, D+w);
    }

    a.pop_back();
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    ll n, s, q, e; cin >> n >> s >> q >> e;
    rep (i,1,n-1) {
        ll u, v, w; cin >> u >> v >> w;
        adj[u].pb({v, w});
        adj[v].pb({u, w});
        roads[i] = {u,v};
    }

    rep (i,1,s) {
        ll x; cin >> x;
        sp[x] = 1;
    }

    rep (i,1,q) {
        ll I, R; cin >> I >> R;
        qs[R].pb({I,i});
    }

    a.pb(0);
    d[e] = 1;
    dfs (e,-1);
    dfs2 (e,-1,0);

    rep (i,1,q) {
        if (ans[i]==-1) cout << "escaped\n";
        else if (ans[i]==-2) cout << "oo\n";
        else cout << ans[i] << "\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...