Submission #1305384

#TimeUsernameProblemLanguageResultExecution timeMemory
1305384vehamValley (BOI19_valley)C++20
0 / 100
316 ms77504 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<ll> vi;
typedef vector<ll> vl;
typedef vector<vi> vvi;
typedef vector<vl> vvl;
struct edge{
    ll v;
    ll w;
};
bool operator<(edge a, edge b){return a.w > b.w;}
bool operator==(edge a, edge b){return make_pair(a.v,a.w) == make_pair(b.v,b.w);};
typedef vector<edge> ve;
typedef vector<ve> vve;
#define MAX 1e17

struct Node{
    ll l,r;
    ll v = MAX;
    Node *LC = nullptr, *RC = nullptr;
    Node(ll l, ll r) : l(l), r(r) {
        if(l != r){
            LC = new Node(l,(l+r)/2);
            RC = new Node((l+r)/2+1,r);
        }
    }
    Node(){}

    ll query(ll i, ll j){
        if(i > r || j < l) return MAX;
        if(i <= l && j >= r) return v;
        return min(LC->query(i,j),RC->query(i,j));
    }

    void update(ll i, ll x){
        if(i > r || i < l) return;
        if(l == r){
            v = min(x,v);
            return;
        }
        LC->update(i,x);
        RC->update(i,x);
        v = min(LC->v,RC->v);
    }
};

struct Solve{
    ll N,Q,E;
    vi A,B,S,I,R,D,Pre,Inv,Sz,HC,HR;
    ve F;
    vl W,DS,Ans,H;
    vve G,C;
    vvi BL,VQ;
    vvl DBL;
    Node Seg;

    void DFS(ll v, edge prev){
        F[v] = prev;
        D[v] = D[prev.v] + 1;
        H[v] = H[prev.v] + prev.w;
        Pre.push_back(v);
        for(edge e : G[v]){
            if(e == prev) continue;
            C[v].push_back(e);
            DFS(e.v,{v,e.w});
            Sz[v] += Sz[e.v];
        }
    }

    void DFS15(ll v, bool ish = 0){
        if(ish) HR[v] = HR[F[v].v];
        else HR[v] = v;
        Pre.push_back(v);
        if(C[v].empty()) return;
        HC[v] = max_element(C[v].begin(),C[v].end(),[&](edge a, edge b){return Sz[a.v] < Sz[b.v];})->v;
        DFS15(HC[v],1);
        for(edge e : C[v]){
            if(e.v == HC[v]) continue;
            DFS15(e.v);
        }
    }

    ll LCA(ll v, ll u){
        if(D[u] > D[v]) swap(u,v);
        if(D[u] < D[v]){
            for(ll d = D[v] - D[u],b = 0;b < BL.size();b++){
                if(d & (1<<b)) v = BL[b][v];
            }
        }
        if(u == v) return u;
        for(ll b = BL.size()-1;b >= 0;b--) if(BL[b][v] != BL[b][u]) v = BL[b][v],u = BL[b][u];
        return BL[0][u];
    }

    // ll distu(ll u, ll n){
    //     ll ans = 0;
    //     for(ll b = 0;b < BL.size();b++){
    //         if(n & (1<<b)) ans += DBL[b][u], u = BL[b][u];
    //     }
    // }

    ll query(ll v, ll r){
        ll ans = MAX;
        ll c = r;
        for(;D[HR[c]] > D[v];c = F[HR[c]].v) ans = min(ans,Seg.query(Inv[HR[c]],Inv[c]));
        ans = min(ans,Seg.query(Inv[v],Inv[c]));
        return ans;
    }

    void DFS2(ll v){
        for(edge e : C[v]){
            DFS2(e.v);
            DS[v] = min(DS[v],DS[e.v] + 2*e.w);
        }
        if(S[v]) DS[v] = -H[v];
        Seg.update(Inv[v],DS[v]);
        for(ll q : VQ[v]){
            if(LCA(v,R[q]) != v) Ans[q] = -1;
            else Ans[q] = query(v,R[q]) + H[R[q]];
        }
    }

    Solve(ll N, ll Q, ll E, vi A, vi B, vi S, vi I, vi R, vl W) : N(N), Q(Q), E(E), A(A), B(B), S(S), I(I), R(R), W(W) {
        BL.assign(ll(log2(N)+1),vi(N));
        DBL.assign(ll(log2(N)+1),vl(N));
        D.assign(N,-1);
        H.assign(N,0);
        Sz.assign(N,1);
        G.assign(N,{});
        F.assign(N,{0,0});
        C.assign(N,{});
        HR.assign(N,0);
        HC.assign(N,0);
        for(ll i = 0;i < N-1;i++){
            G[A[i]].push_back({B[i],W[i]});
            G[B[i]].push_back({A[i],W[i]});
        }
        DFS(E,{E,0});
        Inv.assign(N,0);
        for(ll i = 0;i < N;i++) Inv[Pre[i]] = i;
        DFS15(E);
        for(ll i = 0;i < N;i++) BL[0][i] = F[i].v, DBL[0][i] = F[i].w;
        for(ll p = 1;p < BL.size();p++){
            for(ll i = 0;i < N;i++){
                BL[p][i] = BL[p-1][BL[p-1][i]];
                DBL[p][i] = DBL[p-1][i] + DBL[p-1][BL[p-1][i]];
            }
        }
        for(ll i = 0;i < N-1;i++) if(D[A[i]] < D[B[i]]) swap(A[i],B[i]);
        VQ.assign(N,{});
        for(ll i = 0;i < Q;i++) VQ[A[I[i]]].push_back(i);
        Ans.assign(Q,0);
        DS.assign(N,MAX);
        Seg = Node(0,N-1);
        DFS2(E);
    }
};

int main(){
    ll N,S,Q,E;
    cin >> N >> S >> Q >> E;
    E--;
    vi A(N-1),B=A,Sh(S),IS(N,0),I(Q),R(Q);
    vl W(N-1);
    for(ll i = 0;i < N-1;i++){
        cin >> A[i] >> B[i] >> W[i];
        A[i]--,B[i]--;
    }
    for(ll i = 0;i < S;i++){
        cin >> Sh[i];
        IS[--Sh[i]] = 1;
    }
    for(ll i = 0;i < Q;i++){
        cin >> I[i] >> R[i];
        I[i]--,R[i]--;
    }

    Solve sol(N,Q,E,A,B,IS,I,R,W);
    for(ll a : sol.Ans){
        if(a == -1) cout << "escaped\n";
        else if(a == MAX) cout << "oo\n";
        else cout << a << '\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...