记录编号 422055 评测结果 AAAAA
题目名称 [UVa 548] 树 最终得分 100
用户昵称 Gravatarfate1 是否通过 通过
代码语言 C++ 运行时间 0.001 s
提交时间 2017-07-08 20:12:27 内存使用 0.44 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
int mid[10001],las[10001],father[10001],minl=999999999,jl=0,jk,ww=999999999;
bool flag[10001]={false};
void find(int lm,int rm,int ll,int rl)
{
	int qq;
	if(lm==rm)
	{
		if(mid[lm]<ww)
			ww=mid[lm];
		flag[rm]=true;
		return ;
	}
	for(int i=lm;i<=rm;i++)
	{
		if(mid[i]==las[rl])
			qq=i;
	}
	flag[qq]=true;
	if(qq-1>=lm)
	{
		for(int i=lm;i<=qq-1;i++)
		{
			father[i]+=mid[qq];
		}
	    find(lm,qq-1,ll,ll+(qq-1-lm));
	}
	if(qq+1<=rm&&flag[qq+1]==false)
	{
		for(int i=qq+1;i<=rm;i++)
		{
			father[i]+=mid[qq];
		}
	    find(qq+1,rm,rl-1-(rm-qq-1),rl-1);
	}
}
using namespace std;
int main()
{
	freopen("sumtree.in","r",stdin);
	freopen("sumtree.out","w",stdout);
	string z,h;
	while(getline(cin,z),getline(cin,h))
	{
		for(int i=0;i<=10001;i++)
		{
			flag[i]=false;
		}
		minl=999999999;
		ww=999999999;
		jl=0;
		int ans=0;
		int qqq=0;
		for(int i=0;i<=z.size()-1;i++)
		{
			if(z[i]>='0'&&z[i]<='9')
			{
				if(ans==0)
					ans+=z[i]-'0';
				else
				{
					ans*=10;
					ans+=z[i]-'0';
				}
			}
			if(z[i]==' ')
			{
				mid[qqq]=ans;
				ans=0;
				qqq++;
			}
		}
		mid[qqq]=ans;
		for(int i=0;i<=qqq;i++)
			father[i]=mid[i];
		ans=0;
		qqq=0;
		for(int i=1;i<=h.size()-1;i++)
		{
			if(h[i]>='0'&&h[i]<='9')
			{
				if(ans==0)
					ans+=h[i]-'0';
				else
				{
					ans*=10;
					ans+=h[i]-'0';
				}
			}
			if(h[i]==' ')
			{
				las[qqq]=ans;
				ans=0;
				qqq++;
			}
		}
		las[qqq]=ans;
		find(0,qqq,0,qqq);
		for(int i=0;i<=qqq;i++)
		{
			if(father[i]<minl)
			{
				minl=father[i];
				jl++;
				jk=i;
			}
		}
		if(jl==1)
			cout<<minl<<endl;
		else
		{	
			cout<<ww<<endl;
		}
	}
}