#include "race.h"
//#include "grader.cpp"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize("Ofast,unroll-loops")
using namespace std;
using namespace __gnu_pbds;
#define pb      push_back
#define all(x)  x.begin(),x.end()
#define ar      array
#define mrand(a, b)   uniform_int_distribution<int>(a, b)(rng)
template<class T>bool umax(T &a,T b){if(a<b){a=b;return true;}return false;}
template<class T>bool umin(T &a,T b){if(b<a){a=b;return true;}return false;}
template<class T> using ste = tree<T, null_type, less_equal<T>,
rb_tree_tag, tree_order_statistics_node_update>;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
namespace FAST {
    template<typename T, typename F>
    istream &operator>>(istream &cin, pair<T, F> &p) {
        cin >> p.first >> p.second;
        return cin;
    }
    template<typename T, typename F>
    ostream &operator<<(ostream &cout, pair<T, F> &p) {
        cout << p.first << ' ' << p.second;
        return cout;
    }
    template<typename T>
    istream &operator>>(istream &cin, vector<T> &a) {
    for (T &i: a) cin >> i;
        return cin;
    }
    template<typename T>
    ostream &operator<<(ostream &cout, vector<T> &a) {
          for (T i: a) cout << i << ' ';
        return cout;
    }
    template<typename T>
    istream &operator>>(istream &cin, deque<T> &a) {
        for (T &i: a) cin >> i;
        return cin;
    }
    template<typename T>
    ostream &operator<<(ostream &cout, deque<T> &a) {
        for (T i: a) cout << i << ' ';
        return cout;
    }
}
using namespace FAST;
const long long inf = 1e17 + 7;
const int mod = 1e9 + 7;
const int md = 998244353;
int n,m,k;
basic_string<ar<int,2>>g[200005];
vector<int> sz(200005), vis(200005), cnt(1000005, mod);
int res = mod;
int mx = 0;
vector<int>cycle;
void dfs_sz(int x, int pr){
    sz[x] = 1;
    for(auto [to, cost] : g[x]){
        if(to == pr || vis[to])continue;
        dfs_sz(to, x);
        sz[x] += sz[to];
    }
}
int fc(int x, int pr, int siz){
    for(auto [to, cost]:g[x]){
        if(to == pr || vis[to])continue;
        if(sz[to] > siz)return fc(to, x, siz);
    }
    return x;
}
void dfs(int x, int pr, int dist, int cont, bool flag){
    // cout << x << " " << pr << " " << dist << " " << cont << " " << flag << "\n";
    if(!flag){
        // if(cnt[k-dist] > 0)
        umin(res, cont + cnt[k - dist]);
    }
    else
        umin(cnt[dist], cont);
    cycle.pb(dist);
    for(auto [to, cost] : g[x]){
        if(vis[to] || pr == to)continue;
        if(dist + cost > k)continue;
        dfs(to, x, dist + cost, cont + 1, flag);
    }
}
void dec(int x){
    dfs_sz(x, -1);
    int cen = fc(x, -1, sz[x] / 2);
    // cout << cen << "\n";
    vis[cen] = 1;
    cnt[0] = 0;
    cycle.clear();
    for(auto [to, cost] : g[cen]){
        if(vis[to] || cost > k)continue;
        dfs(to, cen, cost, 1, false);
        dfs(to, cen, cost, 1, true);
    }
    for(auto to:cycle)cnt[to] = mod;
    for(auto [to, cost] : g[cen]){
        if(vis[to])continue;
        dec(to);
    }
}
int best_path(int N, int K, int H[][2], int L[]){
    for(int i = 1;i<N;i++){
        g[H[i-1][0]].pb({H[i-1][1], L[i-1]});
        g[H[i-1][1]].pb({H[i-1][0], L[i-1]});
    }
    k = K;
    dec(0);
    if(res == mod)res = -1;
    // cout << res << "\n";
    return res;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |