Submission #254544

#TimeUsernameProblemLanguageResultExecution timeMemory
254544tinjyuRace (IOI11_race)C++14
100 / 100
650 ms47984 KiB
#include "race.h"
#include <iostream>
using namespace std;
long long int ans=99999999999,a[1000005],t[1000005][2],p,num,f[1000005],tag[1000005],son[1000005],n,k,map[1000005][3],road[1000005];
int build(int x,int fa)
{
	son[x]=1;
	f[x]=fa;
	long long int g=road[x];
	while(g!=-1)
	{
		long long int now=map[g][0];
		if(now!=fa && tag[now]==0)
		{
			build(now,x);
			son[x]+=son[now];
		}
		g=map[g][1];
	}
}
int find(int x,int fa,long long int sum)
{
	long long int g=road[x];
	long long int can=1;
	if(sum>num/2)can=0;
	while(g!=-1)
	{
		long long int now=map[g][0];
		if(now!=fa && tag[now]==0)
		{
			long long int tmp=find(now,x,sum+son[x]-son[now]);
			if(tmp!=-1)return tmp;
			if(son[now]>num/2)can=0;
		}
		g=map[g][1];
	}
	if(can==0)return -1;
	return x;
}
int dfs(int x,long long int len,int fa,int cnt)
{
	if(len<=k)
	{
		p++;
		t[p][0]=len;
		t[p][1]=cnt;
	}
	long long int g=road[x];
	while(g!=-1)
	{
		long long int now=map[g][0];
		if(now!=fa && tag[now]==0)
		{
			dfs(now,len+map[g][2],x,cnt+1);
		}
		g=map[g][1];
	}
}
int solve(int x)
{
	build(x,-1);
	num=son[x];
	long long int st=find(x,-1,0);
	long long int g=road[st],pp=1;	
	//cout<<"solve"<<st<<endl;
	while(g!=-1)
	{
		long long int now=map[g][0];
	//	cout<<now<<endl;
		if(tag[now]==0)
		{
			dfs(now,map[g][2],st,1);
			for(int i=pp;i<=p;i++)
			{
				ans=min(ans,a[k-t[i][0]]+t[i][1]);
				//cout<<t[i][0]<<" "<<t[i][1]<<"  ";
			}
			//cout<<endl;
			for(int i=pp;i<=p;i++)
			{
				a[t[i][0]]=min(a[t[i][0]],t[i][1]);
			}
			ans=min(ans,a[k]);
			pp=p+1;
		}
		g=map[g][1];
	}
	for(int i=1;i<=p;i++)a[t[i][0]]=9999999999999999;
	g=road[st];
	tag[st]=1;
	p=0;
	while(g!=-1)
	{
		long long int now=map[g][0];
		if(tag[now]==0)
		{
			solve(now);
		}
		g=map[g][1];
	}
}
int best_path(int N, int K, int H[][2], int L[])
{
	n=N;
	k=K;
	for(int i=1;i<=k;i++)a[i]=9999999999999999;
	for(int i=0;i<n;i++)road[i]=-1;
	for(int i=0;i<n-1;i++)
	{
		map[i*2][0]=H[i][0];
		map[i*2][1]=road[H[i][1]];
		map[i*2][2]=L[i];
		road[H[i][1]]=i*2;
		map[i*2+1][0]=H[i][1];
		map[i*2+1][1]=road[H[i][0]];
		map[i*2+1][2]=L[i];
		road[H[i][0]]=i*2+1;
	}
	solve(0);
	if(ans==99999999999)return -1;
  	return ans;
}

Compilation message (stderr)

race.cpp: In function 'int build(int, int)':
race.cpp:20:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
race.cpp: In function 'int dfs(int, long long int, int, int)':
race.cpp:58:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
race.cpp: In function 'int solve(int)':
race.cpp:101:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...