记录编号 420723 评测结果 AAAAA
题目名称 [UVa 548] 树 最终得分 100
用户昵称 Gravatar不需要黄桃 是否通过 通过
代码语言 C++ 运行时间 0.002 s
提交时间 2017-07-05 14:54:55 内存使用 0.48 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
string midd,aftt;
bool son[10010];
int im[10010],fa[10010],dad[10010],aa[10010],js,ans,minn=10002,j,maxx=0;
int wer;
void fz(int kk[],int pp[],int qd,int zd,int dd)
{
	if(dd==1)
		for(int i=qd;i<zd;i++)
			kk[i]=pp[i];
	else
		for(int i=qd;i<zd;i++)
			kk[i-qd+1]=pp[i];
}
void buildd(int s1[],int s2[],int ro)
{
	if(s1[0]>=1)
	{
		int fat=s2[s2[0]],po;
		dad[fat]=ro;son[ro]=1;
		if(s1[0]>1)
		{
			int sm[10010],sa[10010];
			for(int i=1;i<=s2[0];i++)
				if(s1[i]==fat)
				{
					po=i;
					break;
				}
			if(po<=10000)
				fz(sm,s1,1,po,1);
			sm[0]=po-1;
			if(po<=10000)
				fz(sa,s2,1,po,1);
			sa[0]=po-1;
			buildd(sm,sa,s2[s2[0]]);
			memset(sm,0,sizeof(sm));
			memset(sa,0,sizeof(sa));
			if(po<=10000)
				fz(sm,s1,po+1,s1[0]+1,0);
			sm[0]=s1[0]-po;
			if(po<=10000)
				fz(sa,s2,po,s2[0],0);
			sa[0]=s1[0]-po;
			buildd(sm,sa,s2[s2[0]]);
		}
	}
}
void read(string k)
{
	int x=0;js=0;
	memset(aa,0,sizeof(aa));
	for(int i=0;i<k.length();i++)
	{
		if(k[i]>='0'||k[i]<='9')
		{
			x=0;
			while(k[i]>='0'&&k[i]<='9'&&i<k.length())
			{
				x=x*10+k[i]-'0';
				i++;
			}
			if(js<=10000)
				aa[++js]=x;
			if(x>maxx)
				maxx=x;
		}
	}
}
int main()
{
	freopen("sumtree.in","r",stdin);
	freopen("sumtree.out","w",stdout);
	while(getline(cin,midd),getline(cin,aftt))
	{
		if(midd[0]>='0'&&midd[0]<='9')
		{
			memset(dad,0,sizeof(dad));
			memset(son,0,sizeof(son));
			memset(im,0,sizeof(im));
			memset(fa,0,sizeof(fa));
			minn=10002;
			wer=0;
			read(midd);
			if(js<=10000)
				for(int i=1;i<=js;i++)
					im[i]=aa[i];
			im[0]=js;
			read(aftt);
			if(js<=10000)
				for(int i=1;i<=js;i++)
					fa[i]=aa[i];	
			fa[0]=js;
			buildd(im,fa,9999);
			int i;
			for(i=1;i<=maxx&&i<=10000;i++)
			{
				if(!son[i]&&dad[i])
				{
					j=i;ans=0;
					while(j!=9999)
					{
						ans+=j;
						j=dad[j];
					}
					if(ans<minn)
					{
						wer=i;
						minn=ans;
					}
				}
			}
			cout<<wer<<endl;
		}
	}
	return 0;
}