제출 #1248925

#제출 시각아이디문제언어결과실행 시간메모리
1248925Ghulam_Junaid경주 (Race) (IOI11_race)C++20
100 / 100
303 ms93436 KiB
#include <bits/stdc++.h>
#include "race.h"
using namespace std;

typedef long long ll;

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

void dfs(ll v, ll p = -1){
    ll 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()){
        // cerr << "Found1" << endl;
        ans = min(ans, mp[v][k + val[v]] - h[v]);
    }

    for (auto [w, u] : g[v]){
        if (u == p or u == mxc) continue;
        for (auto [sm, hei] : mp[u]){
            if (sm - val[v] == k){
                ans = min(ans, hei - h[v]);
                // cerr << "Found2" << endl;
            }
            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]);
                // cout << sm << " " << hei << " " << k - sm + 2 * val[v] << endl;
            }
        }
        for (auto [sm, hei] : mp[u]){
            if (mp[v].find(sm) != mp[v].end())
                mp[v][sm] = min(mp[v][sm], hei);
            else mp[v][sm] = hei;
        }
    }
    mp[v][val[v]] = h[v];
}

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);

    if (ans > n) ans = -1;
    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...