Submission #1286664

#TimeUsernameProblemLanguageResultExecution timeMemory
1286664joylintpRace (IOI11_race)C++20
21 / 100
3096 ms18408 KiB
#include "race.h"
#include <bits/stdc++.h>
using namespace std;

#define F first
#define S second
#define MP make_pair

int K, ans;
vector<vector<pair<int, int>>> edge;

vector<pair<int, int>> dfs(int u, int par)
{
    multiset<pair<int, int>> ms;
    vector<vector<pair<int, int>>> rets;
    for (auto &[v, w] : edge[u])
        if (v != par)
        {
            vector<pair<int, int>> ret = dfs(v, u);
            for (auto &p : ret)
            {
                p.F += w, p.S++;
                ms.insert(p);
                if (p.F == K)
                    ans = min(ans, p.S);
            }
            rets.push_back(ret);
        }
    for (auto &v : rets)
    {
        for (auto &p : v)
            ms.erase(ms.find(p));
        for (auto &p : v)
        {
            auto it = ms.lower_bound(make_pair(K - p.first, 0));
            if (it != ms.end() && it -> first == K - p.first)
                ans = min(ans, p.second + it -> second);
        }
        for (auto &p : v)
            ms.insert(p);
    }

    vector<pair<int, int>> ret;
    ret.push_back(make_pair(0, 0));
    for (auto it = ms.begin(); it != ms.end(); )
    {
        ret.push_back(*it);
        auto jt = it;
        while (jt != ms.end() && it -> first == jt -> first)
            jt++;
        it = jt;
    }
    return ret;
}

int best_path(int N, int K_, int H[][2], int L[])
{
    K = K_;
    edge.resize(N);
    for (int i = 0; i + 1 < N; i++)
    {
        edge[H[i][0]].push_back(MP(H[i][1], L[i]));
        edge[H[i][1]].push_back(MP(H[i][0], L[i]));
    }
    ans = N, dfs(0, 0);
    return ans == N ? -1 : 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...