Submission #1211690

#TimeUsernameProblemLanguageResultExecution timeMemory
1211690orzorzorz경주 (Race) (IOI11_race)C++20
21 / 100
478 ms327680 KiB
#include <bits/stdc++.h>
#include "race.h"
using namespace std;

#define ll long long
#define ff first
#define ss second

const int mxN = 2e5 + 5;
vector<pair<int, ll>> adj[mxN];
multiset<pair<ll, int>> s[mxN];
int K;

int dfs(int v, int fa) {
    s[v].insert({0, 0}); // Path of length 0 with 0 edges from v
    int min_edges = 1e9;

    for (auto [u, w] : adj[v]) {
        if (u == fa) continue;
        int child_min = dfs(u, v);

        // Paths entirely within u's subtree
        min_edges = min(min_edges, child_min);

        // Paths from v through u
        vector<pair<ll, int>> new_paths;
        for (auto [len, cnt] : s[u]) {
            ll new_len = len + w;
            int new_cnt = cnt + 1;
            if (new_len == K) {
                min_edges = min(min_edges, new_cnt);
            } else if (new_len < K) {
                new_paths.push_back({new_len, new_cnt});
            }
        }

        // Paths combining s[v] and s[u] through v
        for (auto [len1, cnt1] : s[u]) {
            ll need = K - w - len1;
            if (need < 0) continue;
            auto it = s[v].lower_bound({need, 0});
            if (it != s[v].end() && it->ff == need) {
                min_edges = min(min_edges, cnt1 + it->ss + 1);
            }
        }

        // Merge u's paths into v
        for (auto p : new_paths) {
            s[v].insert(p);
        }
    }

    return min_edges == 1e9 ? 1e9 : min_edges;
}

int best_path(int N, int K, int H[][2], int L[]) {
    ::K = K;
    for (int i = 0; i < N; i++) {
        adj[i].clear();
        s[i].clear();
    }
    for (int i = 0; i < N - 1; i++) {
        adj[H[i][0]].push_back({H[i][1], L[i]});
        adj[H[i][1]].push_back({H[i][0], L[i]});
    }
    int result = dfs(0, -1);
    return result == 1e9 ? -1 : result;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...