| 记录编号 | 
        259484 | 
        评测结果 | 
        AAAAA | 
    
    
        | 题目名称 | 
        1635.[UVa 548] 树 | 
        最终得分 | 
        100 | 
            
    
    
        | 用户昵称 | 
         Twist 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;
}