Submission #709328

#TimeUsernameProblemLanguageResultExecution timeMemory
709328lukameladzeValley (BOI19_valley)C++14
100 / 100
271 ms58132 KiB
# include <bits/stdc++.h>
using namespace std;
#define f first
#define s second
#define int long long
#define pii pair <int, int>
#define pb push_back
const int N = 3e5 + 5, inf = 1e12;
int t,n,a[N], dp[N], dep[N],lv[N],tin,in[N],out[N], fix[N],m,q,rt,ed_a[N],ed_b[N];
vector <pii> v[N];
pii par[N][20];
void dfs(int a, int p) {
    if (!fix[a]) dp[a] = inf;
    else dp[a] = -lv[a];
   
    dep[a] = dep[p] + 1;
    tin++;
    in[a] = tin;
    
    for (pii sth : v[a]) {
        int to = sth.f; int c = sth.s;
        if (to == p) continue;
        lv[to] = lv[a] + c;
        dfs(to, a);
        if (dp[to] != inf)
        dp[a] = min(dp[a], dp[to] + 2 * (lv[to] - lv[a]));
    }
    out[a] = tin;
}
void dfs1(int a, int p) {
    
    par[a][0] = {p, dp[a]};
    for (int i = 1; i <= 18; i++) {
        if (par[a][i - 1].f) {
            par[a][i].f = par[par[a][i - 1].f][i - 1].f;
            par[a][i].s = min(par[a][i - 1].s, par[par[a][i - 1].f][i - 1].s);
        }
    }
    for (pii sth : v[a]) {
        int to = sth.f; int c = sth.s;
        if (to == p) continue;
        dfs1(to, a);
    }
}
int upper(int a, int b) {
    return (in[a] <= in[b] && out[a] >= out[b]);
}
main() {
    std::ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>n>>m>>q>>rt;
    for (int i = 1; i <= n - 1; i++) {
        int a, b, c; cin>>a>>b>>c;
        ed_a[i] = a; ed_b[i] = b;
        v[a].pb({b, c});
        v[b].pb({a, c}); 
    }
    for (int i = 1; i <= m; i++) {
        int a; cin>>a;
        fix[a] = 1;
    }
    dfs(rt, 0);
    dfs1(rt, 0);
    for (int i = 1; i <= q; i++) {
        int idx, vert, a, b;
        cin>>idx>>vert;
        a = ed_a[idx]; b = ed_b[idx];
        if (lv[a] < lv[b]) swap(a, b);
        if(!upper(a, vert)) {
            cout<<"escaped\n"; continue;
        }
        int dif = dep[vert] - dep[a] + 1;
        int ans = inf, cur = vert;
        for (int i = 0; i <= 18; i++) {
            if ((1<<i)&dif) {
                ans = min(ans, par[cur][i].s);
                cur = par[cur][i].f;
            }
        }
        if (ans == inf) cout<<"oo\n";
        else cout<<ans + lv[vert]<<"\n";
    }
}

Compilation message (stderr)

valley.cpp: In function 'void dfs1(long long int, long long int)':
valley.cpp:40:29: warning: unused variable 'c' [-Wunused-variable]
   40 |         int to = sth.f; int c = sth.s;
      |                             ^
valley.cpp: At global scope:
valley.cpp:48:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   48 | main() {
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...