# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1163209 | DangKhoizzzz | 경주 (Race) (IOI11_race) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#define int long long
#define pii pair <int , int>
#define fi first
#define se second
using namespace std;
const int INF = 1e9;
const int maxn = 1e6 + 7;
int n , k , depth[maxn] , h[maxn] , ans = INF;
vector <pii> g[maxn];
void dfs_build(int u , int p)
{
for(pii e: g[u])
{
int v = e.fi , w = e.se;
if(v == p) continue;
depth[v] = depth[u] + w;
h[v] = h[u] + 1;
dfs_build(v , u);
}
}
void merging(map <int , int> &a , map <int , int> &b , int reqh , int reqdepth)
{
if(a.size() < b.size()) swap(a , b);
for(pii tmp: b)
{
int v1 = tmp.fi;
int v2 = tmp.se;
if(a.count(k - v1 + 2*reqdepth))
{
ans = min(ans , a[k - v1 + 2*reqdepth] + v2 - 2*reqh);
}
if(a.count(v1)) a[v1] = min(a[v1] , v2);
else a[v1] = v2;
}
if(a.count(k + reqdepth))
{
ans = min(ans , a[k + reqdepth] - reqh);
}
}
map <int , int> dfs(int u , int p)
{
map <int , int> res;
res[depth[u]] = h[u];
for(pii tmp: g[u])
{
int v = tmp.fi;
if(v == p) continue;
map <int , int> con = dfs(v , u);
merging(res , con , h[u] , depth[u]);
}
return res;
}
int best_path(int N, int K, int H[][2], int L[])
{
n = N;
k = K;
for(int i = 0; i < n-1; i++)
{
int u = H[i][0] , v = H[i][1] , w = L[i];
u++ , v++;
g[u].push_back({v , w});
g[v].push_back({u , w});
}
dfs_build(1 , 1);
dfs(1 , 1);
if(ans == INF) return -1;
return ans;
}
// void solve()
// {
// cin >> n >> k;
// for(int i = 1; i < n; i++)
// {
// int u , v , w;
// cin >> u >> v >> w;
// u++ , v++;
// g[u].push_back({v , w});
// g[v].push_back({u , w});
// }
// dfs_build(1 , 1);
// dfs(1 , 1);
// cout << ans << '\n';
// }
// // testing
signed main()
{
//solve();
return 0;
}