Submission #1248903

#TimeUsernameProblemLanguageResultExecution timeMemory
1248903Ghulam_JunaidRace (IOI11_race)C++20
0 / 100
7 ms14404 KiB
#include <bits/stdc++.h>
#include "race.h"
// #include "grader.cpp"
using namespace std;

const int N = 2e5 + 10;
int n, k, val[N], h[N], ans;
vector<pair<int, int>> g[N];
map<int, int> mp[N];

void dfs(int v, int p = -1){
    int mxc = -1;
    for (auto [w, u] : g[v]){
        if (u == p) continue;
        val[u] = val[v] + w;
        h[u] = h[v] + 1;
        dfs(u, v);

        if (mxc == -1 or mp[mxc].size() > mp[u].size())
            mxc = u;
    }

    if (mxc != -1)
        swap(mp[mxc], mp[v]);
    if (mp[v].find(k + val[v]) != mp[v].end())
        ans = min(ans, mp[v][k + val[v]] - h[v]);
    mp[v][val[v]] = h[v];

    for (auto [w, u] : g[v]){
        if (u == p or u == mxc) continue;
        for (auto [sm, hei] : mp[u]){
            if (mp[v].find(k - sm + 2 * val[v]) != mp[v].end())
                ans = min(ans, mp[v][k - sm + 2 * val[v]] + hei - 2 * h[v] + 1);
            if (mp[v].find(sm) != mp[v].end())
                mp[v][sm] = min(mp[v][sm], hei);
            else mp[v][sm] = hei;
        }
    }
}

int best_path(int nn, int kk, int H[][2], int L[]){
    n = nn, k = kk;
    for (int i = 0; i < n - 1; i ++){
        int u = H[i][0], v = H[i][1], w = L[i];
        g[u].push_back({w, v});
        g[v].push_back({w, u});
    }
    ans = n + 1;
    dfs(0);

    return 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...