Submission #899931

#TimeUsernameProblemLanguageResultExecution timeMemory
899931MackerRace (IOI11_race)C++17
21 / 100
3088 ms27216 KiB
#include "race.h"
#include <bits/stdc++.h>
 
using namespace std;
typedef long long ll;
typedef long double ld;
#define all(v) v.begin(), v.end()

//#pragma GCC optimize("Ofast")
//#pragma GCC target("avx2")

vector<vector<pair<int, int>>> adj;
int k;

pair<multiset<pair<int, int>>, int> dfs(int a, int p){
    multiset<pair<int, int>> cur;
    cur.insert({0, 0});
    int res = INT_MAX;
    vector<vector<pair<int, int>>> ch;
    for (auto [b, c] : adj[a]) {
        if(b == p) continue;
        ch.push_back({});
        auto [s, x] = dfs(b, a);
        res = min(res, x);
        for (auto &i : s) {
            if(i.first + c <= k)
                ch.back().push_back({i.first + c, i.second + 1});
        }
    }
    for (auto &&i : ch) for (auto &&j : i) cur.insert(j);

    for (auto &&i : ch) {
        for (auto &&j : i) cur.erase(cur.find(j));
        for (auto &&j : i) {
            if(cur.lower_bound({k - j.first, 0}) == cur.end()) continue;
            pair<int, int> x = *cur.lower_bound({k - j.first, 0});
            if(x.first == k - j.first){
                res = min(res, x.second + j.second);
            }
        }
        for (auto &&j : i) cur.insert(j);
    }
    return {cur, res};
}

int best_path(int N, int K, int H[][2], int L[])
{
    k = K;
    adj.assign(N, {});
    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 ret = dfs(0, 0).second;
    if(ret == INT_MAX) return -1;
    return ret;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...