记录编号 270886 评测结果 AAAAA
题目名称 [UVa 548] 树 最终得分 100
用户昵称 GravatarOstmbh 是否通过 通过
代码语言 C++ 运行时间 0.002 s
提交时间 2016-06-15 13:47:38 内存使用 0.46 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;
const int maxx = 10000 + 10;
int in[maxx],post[maxx],lch[maxx],rch[maxx];
int n;
bool read(int* a){
	string line;
	if(!getline(cin,line))
		return false;
	stringstream ss(line);
	n=0;
	int x;
	while(ss>>x)
		a[n++]=x;
	return n>0;
}
int build(int l1,int r1,int l2,int r2){
	if(l1>r1)
		return 0;
	int root=post[r2];
	int p=l1;
	while(in[p]!=root)
		p++;
	int cnt=p-l1;
	lch[root]=build(l1,p-1,l2,l2+cnt-1);
	rch[root]=build(p+1,r1,l2+cnt,r2-1);
	return root;
}
int best,best_sum;
void dfs(int u,int sum){
	sum+=u;
	if(!lch[u]&&!rch[u])
		if(sum<best_sum||(sum==best_sum&&u<best)){
			best=u;
			best_sum=sum;
		}
	if(lch[u])
		dfs(lch[u],sum);
	if(rch[u])
		dfs(rch[u],sum);
}
int main(){
	freopen("sumtree.in","r",stdin);
	freopen("sumtree.out","w",stdout);
	while(read(in)){
		read(post);
		build(0,n-1,0,n-1);
		best_sum=1000000000;
		dfs(post[n-1],0);
		cout<<best<<endl;
	}
return 0;
}