# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1222048 | elaksher | Race (IOI11_race) | C++20 | 0 ms | 0 KiB |
#include "race.h"
#include <bits/stdc++.h>
using namespace std;
#define int long long
map<int, int> stl[200005];
vector<pair<int, int>> adj[200005];
int dep[200005], dist[200005];
int n, k;
long long ans;
void init(int u = 0, int p = -1) {
stl[u][dist[u]] = dep[u];
for (auto [v, w] : adj[u]) {
if (v != p) {
dep[v] = dep[u] + 1;
dist[v] = dist[u] + w;
init(v, u);
}
}
}
void dfs(int u = 0, int p = -1) {
long long target = k + 2 * dist[u];
for (auto [v, w] : adj[u]) {
if (v != p) {
dfs(v, u);
if (stl[v].size() > stl[u].size())
swap(stl[u], stl[v]);
for (auto [len, edges] : stl[v]) {
if (stl[u].count(target - len)) {
ans = min(ans, stl[u][target - len] + edges - 2 * dep[u]);
}
}
for (auto [len, edges] : stl[v]) {
if (stl[u].count(len)) {
stl[u][len] = min(stl[u][len], edges);
} else {
stl[u][len] = edges;
}
}
}
}
}
extern "C" {
int best_path(int _n, int _k, int h[][2], int l[]) {
n = _n; k = _k;
ans = 1e18;
for (int i = 0; i < n; i++) {
adj[i].clear();
stl[i].clear();
dep[i] = 0;
dist[i] = 0;
}
for (int i = 0; i < n - 1; i++) {
int u = h[i][0];
int v = h[i][1];
int w = l[i];
adj[u].emplace_back(v, w);
adj[v].emplace_back(u, w);
}
init();
dfs();
return ans == 1e18 ? -1 : ans;
}
}