题目背景
勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利。但是,小L对数据结构的掌握实在十分渣渣。
所以,小L当时卡在了二叉树。
题目描述
在计算机科学中,二叉树是每个结点最多有两个子结点的有序树。通常子结点被称作“左孩子”和“右孩子”。二叉树被用作二叉搜索树和二叉堆。随后他又和他人讨论起了二叉搜索树。什么是二叉搜索树呢?二叉搜索树首先是一棵二叉树。设key[p]表示结点p上的数值。对于其中的每个结点p,若其存在左孩子lch,则key[p]>key[lch];若其存在右孩子rch,则key[p]
var
n,i,j,k,p,x,y:longint;
a,b,d:array[0..100000] of longint;
f:array[0..100000,1..2] of longint;
procedure dg(t:longint);
begin
if (f[t,1]=0)and(f[t,2]=0) then
begin
inc(b[0]);
b[b[0]]:=a[t];
exit;
end;
if f[t,1]<>0 then dg(f[t,1]);
inc(b[0]);
b[b[0]]:=a[t];
if f[t,2]<>0 then dg(f[t,2]);
end;
function gd(x:longint):longint;
var
l,r,mid:longint;
begin
l:=1;
r:=k;
while l<=r do
begin
mid:=(l+r) div 2;
if x>=d[mid] then l:=mid+1
else r:=mid-1;
end;
exit(l);
end;
begin
readln(n);
for i:=1 to n do read(a[i]);
readln;
for i:=1 to n-1 do
begin
readln(x,y);
f[x,y+1]:=i+1;
end;
dg(1);
for i:=1 to n do b[i]:=b[i]-i;
for i:=1 to n do
begin
p:=gd(b[i]);
d[p]:=b[i];
if k<p then k:=p;
end;
write(n-k);
end.