제출 #912552

#제출 시각아이디문제언어결과실행 시간메모리
912552asdasdqwerValley (BOI19_valley)C++14
100 / 100
458 ms82436 KiB
#include <bits/stdc++.h>
using namespace std;

#define int int64_t
#define pii array<int,2>
#define tii array<int,3>

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

    int n,s,q,e;cin>>n>>s>>q>>e;
    e--;

    vector<vector<pii>> g(n);
    vector<tii> edg;
    for (int i=1;i<n;i++) {
        int a,b,w;cin>>a>>b>>w;
        a--;b--;
        g[a].push_back({b,w});
        g[b].push_back({a,w});
        edg.push_back({a,b,w});
    }

    vector<bool> shop(n,false);
    for (int i=0;i<s;i++) {
        int c;cin>>c;shop[--c]=true;
    }

    vector<int> dp(n,1e16);
    vector<vector<int>> lft(n, vector<int>(20,-1)), weight(n, vector<int>(20,0)), shr(n, vector<int>(20,1e16));
    vector<int> d(n,0);
    function<void(int,int)> dfs=[&](int node, int pv) {
        if (shop[node]) {
            dp[node]=0;
        }

        for (auto [x, w]:g[node]) {
            if (x==pv)continue;
            d[x]=d[node]+1;
            lft[x][0]=node;
            weight[x][0]=w;
            dfs(x,node);
            dp[node]=min(dp[node],dp[x]+w);
        }
    };

    dfs(e,-1);

    for (int i=0;i<n;i++) {
        if (e == i) continue;
        shr[i][0] = dp[lft[i][0]] + weight[i][0];
    }

    for (int j=1;j<20;j++) {
        for (int i=0;i<n;i++) {
            lft[i][j]=lft[i][j-1];
            if (lft[i][j]!=-1) {
                lft[i][j]=lft[lft[i][j]][j-1];
                weight[i][j]=weight[i][j-1]+weight[lft[i][j-1]][j-1];
                shr[i][j] = min(shr[i][j-1], shr[lft[i][j-1]][j-1] + weight[i][j-1]);
            }
        }
    }

    function<int(int,int)> jmp=[&](int a,int steps)->int {
        int cnt=0;
        while (steps) {
            if ((steps&1)==1) {
                a=lft[a][cnt];
                if (a==-1)return-1;
            }
            cnt++;steps>>=1;
        }
        return a;
    };

    function<int(int,int)> lca=[&](int a,int b) -> int {
        if (d[a]<d[b])swap(a,b);
        a=jmp(a,d[a]-d[b]);
        if(a==b)return a;

        for (int i=19;i>=0;i--) {
            if(lft[a][i]!=lft[b][i]) {
                a=lft[a][i];
                b=lft[b][i];
            }
        }
        return lft[a][0];
    };

    function<int(int,int)> shortest=[&](int a, int steps) -> int {
        int mn = dp[a];
        int pWeight=0;
        int cnt=0;

        while (steps) {
            if ((steps&1)==1) {
                int candidate = pWeight + shr[a][cnt];
                mn = min(mn, candidate);
                pWeight += weight[a][cnt];
                a=lft[a][cnt];
            }
            steps>>=1;cnt++;
        }
        return mn;
    };

    while (q--) {
        int i,r;cin>>i>>r;
        i--;r--;
        int n1=edg[i][0], n2=edg[i][1];
        if (d[n1] <= d[r] && d[n2] <= d[r] && lca(n1, r) == n1 && lca(n2, r) == n2) {
            int low=max(d[n1], d[n2]);
            int mn = shortest(r, d[r]-low);
            if (mn >= 1e16) {
                cout<<"oo\n";
            }

            else {
                cout<<mn<<"\n";
            }
        }

        else {
            cout<<"escaped\n";
        }
    }
}

컴파일 시 표준 에러 (stderr) 메시지

valley.cpp: In lambda function:
valley.cpp:38:19: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   38 |         for (auto [x, w]:g[node]) {
      |                   ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...