제출 #1346244

#제출 시각아이디문제언어결과실행 시간메모리
1346244eldorbek_008경주 (Race) (IOI11_race)C++20
100 / 100
289 ms34408 KiB
#include <bits/stdc++.h>
using namespace std;

const int inf = 2e9;

int best_path(int n, int k, int h[][2], int l[]) {
    vector<vector<pair<int, int>>> g(n + 1);
    for (int i = 0; i < n - 1; i++) {
        g[h[i][0]].emplace_back(h[i][1], l[i]);
        g[h[i][1]].emplace_back(h[i][0], l[i]);
    }

    vector<int> sz(n + 1);
    vector<int> vis(n + 1);

    auto dfs_sz = [&](auto dfs_sz, int u, int p) -> void {
        sz[u] = 1;
        for (auto [v, w] : g[u]) {
            if (v != p and !vis[v]) {
                dfs_sz(dfs_sz, v, u);
                sz[u] += sz[v];
            }
        }
    };

    auto find_c = [&](auto find_c, int u, int p, int tot) -> int {
        for (auto [v, w] : g[u]) {
            if (v != p and !vis[v] and sz[v] > tot / 2) {
                return find_c(find_c, v, u, tot);
            }
        }
        return u;
    };

    int ans = inf;
    vector<int> mods;
    vector<int> min_e(k + 1, inf);

    min_e[0] = 0;

    auto calc = [&](auto calc, int u, int p, int cw, int ce, int upd) -> void {
        if (cw > k) {
            return;
        }
        if (upd == 1) {
            if (min_e[cw] > ce) {
                min_e[cw] = ce;
                mods.emplace_back(cw);
            }
        } else {
            ans = min(ans, ce + min_e[k - cw]);
        }

        for (auto [v, w] : g[u]) {
            if (!vis[v] and v != p) {
                calc(calc, v, u, cw + w, ce + 1, upd);
            }
        }
    };

    auto solve = [&](auto solve, int u) -> void {
        dfs_sz(dfs_sz, u, -1);
        int c = find_c(find_c, u, -1, sz[u]);

        vis[c] = 1;

        for (auto [v, w] : g[c]) {
            if (!vis[v]) {
                calc(calc, v, c, w, 1, 0);
                calc(calc, v, c, w, 1, 1);
            }
        }

        for (int &x : mods) {
            min_e[x] = inf;
        }
        mods.clear();

        for (auto [v, w] : g[c]) {
            if (!vis[v]) {
                solve(solve, v);
            }
        }
    };

    solve(solve, 0);
    
    if (ans == inf) {
        return -1;
    } else {
        return ans;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...