Submission #953364

#TimeUsernameProblemLanguageResultExecution timeMemory
953364JuanchokiRace (IOI11_race)C++14
0 / 100
3012 ms262144 KiB
#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(int N, int K, int H[][2], int 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;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...