Submission #1095532

#TimeUsernameProblemLanguageResultExecution timeMemory
1095532MateiKing80Valley (BOI19_valley)C++14
100 / 100
174 ms56516 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int N = 100000;
const ll inf = 1e18;
int n, s, q, e, t = 0;

vector<ll> in(N), out(N), magazin(N), x(N, inf), dp(N), d(N);
vector<pair<int, int>> much;
vector<vector<pair<int, int>>> vec(N);
vector<vector<ll>> lift(N, vector<ll>(18)), mn(N, vector<ll>(18));

void dfs(int u, int p)
{
    in[u] = t ++;
    lift[u][0] = p;
    if(magazin[u])
        x[u] = d[u];
    for(auto [v, w] : vec[u])
        if (v != p)
        {
            d[v] = d[u] + w;
            dfs(v, u);
            x[u] = min(x[u], x[v]);
        }
    dp[u] = (x[u] == inf ? inf : x[u] - 2 * d[u]);
    mn[u][0] = dp[u];
    out[u] = t ++;
}

bool is_ancestor(int u, int v)
{
    return (in[u] <= in[v] && out[u] >= out[v]);
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin >> n >> s >> q >> e;
    e --;
    for(int i = 0; i < n - 1; i ++)
    {
        int u, v, w;
        cin >> u >> v >> w;
        u --;
        v --;
        much.emplace_back(u, v);
        vec[u].emplace_back(v, w);
        vec[v].emplace_back(u, w);
    }
    for(int i = 0; i < s; i ++)
    {
        int u;
        cin >> u;
        magazin[u - 1] = 1;
    }
    dfs(e, e);
    for(int b = 1; b < 18; b ++)
        for(int i = 0; i < n; i ++)
        {
            lift[i][b] = lift[lift[i][b - 1]][b - 1];
            mn[i][b] = min(mn[i][b - 1], mn[lift[i][b - 1]][b - 1]);
        }
    while(q --)
    {
        int i, r;
        cin >> i >> r;
        i --;
        r --;
        auto [u, v] = much[i];
        if(is_ancestor(u, v))
            swap(u, v);
        if(!is_ancestor(u, r))
            cout << "escaped\n";
        else
        {
            ll best = dp[u], dd = d[r];
            for(int b = 17; b >= 0; b --)
                if(is_ancestor(u, lift[r][b]))
                {
                    best = min(best, mn[r][b]);
                    r = lift[r][b];
                }
            if(best == inf)
                cout << "oo\n";
            else
                cout << dd + best << '\n';
        }
    }
}

Compilation message (stderr)

valley.cpp: In function 'void dfs(int, int)':
valley.cpp:21:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   21 |     for(auto [v, w] : vec[u])
      |              ^
valley.cpp: In function 'int main()':
valley.cpp:73:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   73 |         auto [u, v] = much[i];
      |              ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...