Submission #915598

#TimeUsernameProblemLanguageResultExecution timeMemory
915598upedValley (BOI19_valley)C++14
100 / 100
357 ms68660 KiB
#include <bits/stdc++.h>

#define DEBUG(x) cout << #x << ": " << x << '\n';

using namespace std;
using ll = long long;

const ll MAXN = 1e5 + 1;
const ll INF = 1e18;
vector<pair<ll, ll>> adj[MAXN];
ll shop_in_subtree[MAXN];
ll tin[MAXN];
ll tout[MAXN];
ll depth[MAXN];
// destination, min(shop_in_subtree) on path to dst, dist_of_path
tuple<ll, ll, ll> jmp[20][MAXN];
bool is_shop[MAXN];
ll timer = 0;

void dfs(ll n, ll p = 0, ll pw = 0) {
    depth[n] = depth[p] + 1;
    tin[n] = timer++;
    shop_in_subtree[n] = (is_shop[n] ? 0 : INF);
    for (auto& [x, w] : adj[n]) {
        if (x == p) continue;
        dfs(x, n, w);
        shop_in_subtree[n] = min(shop_in_subtree[x] + w, shop_in_subtree[n]);
    }
    jmp[0][n] = {p, shop_in_subtree[n], pw};
    tout[n] = timer++;
}

int main() {
    ll n, s, q, e;
    cin >> n >> s >> q >> e;
    vector<pair<ll, ll>> edges(n - 1);
    for (ll i = 0; i < n - 1; ++i) {
        ll a, b, w;
        cin >> a >> b >> w;
        adj[a].emplace_back(b, w);
        adj[b].emplace_back(a, w);
        edges[i] = {a, b};
    }

    for (ll i = 0; i < s; ++i) {
        ll x;
        cin >> x;
        is_shop[x] = true;
    }
    dfs(e);
    for (ll i = 1; i < 20; ++i) {
        for (ll j = 1; j <= n; ++j) {
            auto& [a, b, c] = jmp[i - 1][j];
            auto& [x, y, z] = jmp[i - 1][a];
            jmp[i][j] = {x, min(b, c + y), c + z};
        }
    }

    // for (ll i = 1; i <= n; ++i) {
    //     cout << jmp[0][i].second << ' ';
    // }
    // cout << '\n';

    for (ll i = 0; i < q; ++i) {
        ll idx, r;
        cin >> idx >> r;
        auto& [a, b] = edges[idx - 1];
        // a is deeper
        if (depth[b] > depth[a]) swap(a, b);
        if (tin[r] <= tout[a] && tin[r] >= tin[a]) {
            ll ans = shop_in_subtree[r];
            ll sum = 0;
            for (ll j = 19; j >= 0; --j) {
                auto& [x, y, z] = jmp[j][r];
                if (x != 0 && depth[x] >= depth[a]) {
                    ans = min(ans, y + sum);
                    r = x;
                    sum += z;
                }
            }
            ans = min(ans, shop_in_subtree[r] + sum);
            if (ans == INF) {
                cout << "oo\n";
            } else {
                cout << ans << '\n';
            }
        } else {
            cout << "escaped\n";
        }
    }
}

Compilation message (stderr)

valley.cpp: In function 'void dfs(ll, ll, ll)':
valley.cpp:24:16: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   24 |     for (auto& [x, w] : adj[n]) {
      |                ^
valley.cpp: In function 'int main()':
valley.cpp:53:19: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   53 |             auto& [a, b, c] = jmp[i - 1][j];
      |                   ^
valley.cpp:54:19: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   54 |             auto& [x, y, z] = jmp[i - 1][a];
      |                   ^
valley.cpp:67:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   67 |         auto& [a, b] = edges[idx - 1];
      |               ^
valley.cpp:74:23: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   74 |                 auto& [x, y, z] = jmp[j][r];
      |                       ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...