我也TLE了
```cpp
#include<iostream>
#include<cstring>
#define MAXN 1000001
#define INF 252645135
using namespace std;
struct side{int l,r;}t[MAXN];
int n,a[MAXN],b[MAXN],ans=INF,idx=INF;
int read(int*a)
{
int tot=0;
string buf;
getline(cin,buf);
for(unsigned i=0;i<buf.size();i++)
{
int data=0;
if(isdigit(buf[i]))
{
while(isdigit(buf[i]))data=data*10+buf[i]-'0',i++;
a[++tot]=data;
}
}
return tot;
}
int dfs(int l1,int r1,int l2,int r2) //递归建树
{
int root=b[r2],k,len;
if(l1<r1&&l2<r2)
{
for(int i=l1;i<=r1;i++)
if(a[i]==root){k=i;break;}
len=k-l1+1;
t[root].l=dfs(l1,l1+len-2,l2,l2+len-2);
t[root].r=dfs(l1+len,r1,l2+len-1,r2-1);
}
return root;
}
void find(int now,int sum) //递归找答案
{
if(t[now].l==0&&t[now].r==0) //找到叶子节点
if(sum+now<ans||(sum+now==ans&&now<idx))
ans=sum+now,idx=now;
if(t[now].l)find(t[now].l,sum+now);
if(t[now].r)find(t[now].r,sum+now);
}
int main()
{
while(n=read(a),read(b))
{
ans=idx=INF;
int root=dfs(1,n,1,n);
find(root,0);
cout<<idx<<endl;
}
}
```
by NewSjf @ 2019-11-26 19:27:06