This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "race.h"
#include <bits/stdc++.h>
const int INF = 1e9;
using namespace std;
using pii = pair<int, int>;
using LL = long long;
#define pb push_back
#ifdef LOCAL
#define debug(...) cout << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__)
#else
#define debug(...) "zzz"
#endif
int best_path(int N, int K, int H[][2], int L[]) {
LL ans = INF;
vector e(N, vector<pii>());
for (int i = 0; i < N - 1; i++) {
int x = H[i][0], y = H[i][1], d = L[i];
e[x].pb({y, d});
e[y].pb({x, d});
}
//debug(e);
vector<bool> v(N);
vector<int> sub(N);
auto cen_decomp = [&](auto cen_decomp, int g, int SZ) -> void {
auto dfs_sub = [&](auto dfs_sub, int g, int p) -> void {
sub[g] = 1;
for (auto [u, d] : e[g]) if (u != p && !v[u]) {
dfs_sub(dfs_sub, u, g);
sub[g] += sub[u];
}
};
auto find_cen = [&](auto find_cen, int g, int p) -> int {
for (auto [u, d] : e[g]) if (u != p && !v[u]) {
if (sub[u] * 2 >= SZ)
return find_cen(find_cen, u, g);
}
return g;
};
dfs_sub(dfs_sub, g, -1);
g = find_cen(find_cen, g, -1);
dfs_sub(dfs_sub, g, -1);
//debug(g);
v[g] = 1;
map<LL, LL> dp;
auto fill_dp = [&](auto fill_dp, int g, int p, int L, int d) -> void {
if (!dp.count(L)) {
dp[L] = d;
} else {
dp[L] = min(dp[L], (LL)d);
}
for (auto [u, nl] : e[g]) if (!v[u] && u != p) {
fill_dp(fill_dp, u, g, L + nl, d + 1);
}
};
auto compare_dp = [&](auto compare_dp, int g, int p, int L, int d) -> void {
if (dp.count(K - L)) {
ans = min(ans, d + dp[K - L]);
}
for (auto [u, nl] : e[g]) if (!v[u] && u != p) {
compare_dp(compare_dp, u, g, L + nl, d + 1);
}
};
for (auto [u, d] : e[g]) if (!v[u]) {
compare_dp(compare_dp, u, g, d, 1);
fill_dp(fill_dp, u, g, d, 1);
}
for (auto [u, d] : e[g]) if (!v[u]) {
cen_decomp(cen_decomp, u, sub[u]);
}
};
cen_decomp(cen_decomp, 0, N);
return (ans >= INF ? -1 : ans);
}
# | 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... |