제출 #898768

#제출 시각아이디문제언어결과실행 시간메모리
898768Muhammad_AneeqRace (IOI11_race)C++17
43 / 100
3045 ms34336 KiB
#include <vector>
#include <set>
#include <map>
#include "race.h"
using namespace std;
int const MAXN=2e5+10;
vector<pair<int,int>>nei[MAXN]={};
int reqval=0,ans=1e9+10;
bool dead[MAXN]={};
int sz[MAXN]={};
int h[MAXN]={};
void dfs(int n,int m=-1)
{
	sz[n]=1;
	for (auto [i,we]:nei[n])
	{
		if (!dead[i]&&i!=m)
		{
			dfs(i,n);
			sz[n]+=sz[i];
		}
	}
}
int find_centroid(int n,int m,int root)
{
	for (auto [i,we]:nei[n])
	{
		if (!dead[i]&&i!=m&&sz[i]*2>sz[root])
			return find_centroid(i,n,root);
	}
	return n;
}
map<long long,int>f;
vector<pair<long long,int>>cur;
void dfs1(int n,int m,long long val)
{
	cur.push_back({val,h[n]});
	if (val>reqval)
		return;
	if (f.find(reqval-val)!=f.end())
	{
		ans=min(ans,h[n]+f[reqval-val]);
	}
	for (auto [i,we]:nei[n])
	{
		if (!dead[i]&&i!=m)
		{
			h[i]=h[n]+1;
			dfs1(i,n,val+we);
		}
	}
}
void sol(int n)
{
	dfs(n);
	if (sz[n]==1)
		return;
	n=find_centroid(n,-1,n);
	dead[n]=1;
	cur={};
	f.clear();
	f[0]=0;
	for (auto [i,we]:nei[n])
	{
		if (!dead[i])
		{
			h[i]=1;
			dfs1(i,-1,we);
			for (auto [j,w]:cur)
			{
				if (f.find(j)==f.end())
					f[j]=w;
				f[j]=min(f[j],w);
			}
		}
	}
	for (auto [i,we]:nei[n])
	{
		if (!dead[i])
			sol(i);
	}
}
int best_path(int n, int K, int H[][2], int L[])
{
	reqval=K;
	for (int i=0;i<n-1;i++)
	{
		int u=H[i][0],v=H[i][1];
		nei[u].push_back({v,L[i]});
		nei[v].push_back({u,L[i]});
	}
	sol(0);
	ans=(ans==1e9+10?-1:ans);
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...