Submission #1351634

#TimeUsernameProblemLanguageResultExecution timeMemory
1351634waygonzRace (IOI11_race)C++20
0 / 100
0 ms344 KiB
#include "race.h"
#include <bits/stdc++.h>

using namespace std;

int best_path(int N, int K, int H[][2], int L[]) {
    vector<vector<pair<int, int>>> adj(N);
    for (int i = 0; i < N-1; i++) {
        adj[H[i][0]].emplace_back(H[i][1], L[i]);
        adj[H[i][1]].emplace_back(H[i][0], L[i]);
    }
    vector<int> dp(N), sum(N);
    vector<bool> rem(N, false);
    function<int(int, int)> dfs_sz = [&](int x, int p) {
        int res = 1;
        for (auto &[u, w] : adj[x]) {
            if (u == p || rem[u]) continue;
            res += dfs_sz(u, x);
        }
        return dp[x] = res;
    };
    function<int(int, int)> dfs_sum = [&](int x, int p) {
        int res = 0;
        for (auto &[u, w] : adj[x]) {
            if (u == p || rem[u]) continue;
            res += w + dfs_sum(u, x);
        }
        return res;
    };
    function<int(int, int, int)> centroid = [&](int x, int p, int sz) {
        for (auto &[u, w] : adj[x]) {
            if (u == p || rem[u]) continue;
            if (dp[u] * 2 > sz) return centroid(u, x, sz);
        }
        return x;
    };
    pair<int, int> ans = {1e9, 0};
    function<void(int)> build = [&](int x) {
        int cen = centroid(x, -1, dfs_sz(x, -1));
        if (dfs_sum(cen, -1) < K) { rem[cen] = true; return; }
        rem[cen] = true;
        map<int, pair<int, int>> mn;
        queue<tuple<int, int, int, int>> q;
        mn[0] = {0, 1};
        for (auto &[u, w] : adj[cen]) {
            if (rem[u]) continue;
            map<int, pair<int, int>> nw;
            nw[w] = {1, 1};
            q.emplace(u, cen, w, 1);
            while (!q.empty()) {
                auto [qu, qp, qw, ql] = q.front();
                q.pop();
                for (auto &[v, ww] : adj[qu]) {
                    if (v == qp || rem[v] || ww + qw > K) continue;
                    if (!nw.count(ww+qw)) nw[ww+qw] = {ql+1, 1};
                    else if (nw[ww+qw].first > ql+1) nw[ww+qw] = {ql+1, 1};
                    else if (nw[ww+qw].first == ql+1) nw[ww+qw].second++;
                    q.emplace(v, qu, ww+qw, ql+1);
                }
            }
            for (auto &[len, val] : nw) {
                if (!mn.count(K-len)) continue;
                int a = mn[K-len].first + val.first, b = mn[K-len].second * val.second;
                if (a < ans.first) ans = {a, b};
                else if (a == ans.first) ans.second += b;
            }
            for (auto &[len, val] : nw) {
                if (!mn.count(len)) mn[len] = val;
                if (mn[len].first > val.first) mn[len] = val;
                else if (mn[len].first == val.first) mn[len].second += val.second;
            }
        }
        for (auto &[u, w] : adj[cen]) {
            if (rem[u]) continue;
            build(u);
        }
    };
    build(0);
    if (ans.first == 1e9) return -1;
    else return ans.second;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...