# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
953362 | Juanchoki | Race (IOI11_race) | C++14 | 0 ms | 0 KiB |
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 <bits/stdc++.h>
#include "race.h"
#define ll long long
using namespace std;
struct tpos
{
ll v, w;
};
ll freq[1<<20], subarbol[1<<20];
bool visi[1<<20];
ll resp = 1LL<<62;
ll N, k;
vector<tpos> adj[1<<20];
ll centroide (ll yo, ll pa, ll n)
{
for (tpos v: adj[yo])
{
if (v.v == pa) continue;
if (subarbol[v.v] > n/2) return centroide(v.v, yo, n);
}
return yo;
}
ll dfs(ll yo, ll pa)
{
subarbol[yo] = 1;
for (tpos v: adj[yo])
{
if (v.v == pa) continue;
subarbol[yo] += dfs(v.v, yo);
}
return subarbol[yo];
}
void dfs2 (ll yo, ll pa, ll peso, ll camino)
{
if (freq[peso] == 0) freq[peso] = camino;
freq[peso] = min(camino, freq[peso]);
if (peso == k) resp = min(resp, camino);
if (freq[k-peso] != 0) resp = min(resp, freq[peso]+freq[k-peso]);
for (tpos v: adj[yo])
{
if (v.v == pa) continue;
dfs2(v.v, yo, peso + v.w, camino+1);
}
}
void dfs3(ll yo, ll pa, ll peso)
{
if (peso > k) return;
freq[peso] = 0;
for (tpos v: adj[yo])
{
if (v.v == pa) continue;
dfs3(v.v, yo, peso + v.w);
}
}
void responde (ll yo, ll pa)
{
ll mero_mero = centroide(yo, pa, subarbol[yo]);
yo = mero_mero;
dfs2(yo, pa, 0, 0);
dfs3(yo, pa, 0);
for (tpos v: adj[yo])
{
responde(v.v, yo);
}
}
int best_path(ll N, ll K, ll H[][2], ll L[])
{
::N = N;
k = K;
for (ll i = 0; i < N-1; i++)
{
adj[H[i][1]].push_back({H[i][0], L[i]});
adj[H[i][0]].push_back({H[i][1], L[i]});
}
responde(1, -1);
if (resp == 1LL<<62) resp = -1;
return resp;
}