제출 #1161485

#제출 시각아이디문제언어결과실행 시간메모리
1161485JahonaliX경주 (Race) (IOI11_race)C++20
43 / 100
163 ms327680 KiB
#include <bits/stdc++.h>

using namespace std;

int best_path(int n, int k, int h[][2], int l[]) {
    if (n <= 1000) {
        int x = n;
        vector<vector<pair<int, int>>> a(n);
        for (int i = 0; i + 1 < n; ++i) a[h[i][0]].emplace_back(h[i][1], l[i]), a[h[i][1]].emplace_back(h[i][0], l[i]);
        function<void(int, int, int, int)> dfs = [&] (int i, int p, int c, int w) {
            if (w == k) {
                x = c;
                return;
            }
            if (c == x || w > k) return;
            for (auto [j, z] : a[i]) if (p != j) dfs(j, i, c + 1, w + z);
        };
        for (int i = 0; i < n; ++i) dfs(i, -1, 0, 0);
        if (x == n) x = -1;
        return x;
    }
    else {
        int z = n;
        vector<vector<pair<int, int>>> a(n);
        for (int i = 0; i + 1 < n; ++i) a[h[i][0]].emplace_back(h[i][1], l[i]), a[h[i][1]].emplace_back(h[i][0], l[i]);
        auto dfs = [&] (auto dfs, int i, int p, int w) -> vector<int> {
            vector<int> dp(k + 1, -1);
            dp[0] = 0;
            for (auto [j, wtf] : a[i]) {
                if (p != j) {
                    auto x = dfs(dfs, j, i, wtf);
                    for (int y = 0; y <= k; ++y) if (~dp[k - y] && ~x[y]) z = min(z, dp[k - y] + x[y]);
                    for (int y = 0; y <= k; ++y) {
                        if (~x[y]) {
                            if (~dp[y]) dp[y] = min(dp[y], x[y]);
                            else dp[y] = x[y];
                        }
                    }
                }
            }
            for (int y = k - w; y >= 0; --y) {
                if (dp[y] == -1) dp[y + w] = -1; 
                else dp[y + w] = dp[y] + 1;
            }
            for (int y = 0; y < min(k, w); ++y) dp[y] = -1;
            if (~dp[k]) z = min(z, dp[k]);
            return dp;
        };
        dfs(dfs, 0, 0, 0);
        if (z == n) z = -1;
        return z;
    }
    return n;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...