记录编号 259484 评测结果 AAAAA
题目名称 [UVa 548] 树 最终得分 100
用户昵称 GravatarTwist Fate 是否通过 通过
代码语言 C++ 运行时间 0.001 s
提交时间 2016-05-09 20:00:59 内存使用 0.46 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<string>
#include<sstream>
#include<iostream>
using namespace std;
const int maxn=10000+10;
int in_order[maxn],post_order[maxn],lch[maxn],rch[maxn];
int n;
bool read_list(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_order[r2];
	int p=l1;
	while (in_order[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_list(in_order)){
		read_list(post_order);
		build(0,n-1,0,n-1);
		best_sum=10000000;
		dfs(post_order[n-1],0);
		cout<<best<<"\n";
	}
	return 0;
}