3992: 堆(heap)
内存限制:512 MB
时间限制:3.000 S
评测方式:文本比较
命题人:
提交:32
解决:6
题目描述
heap.in/out/cpp
给定一个n个点堆(不一定是二叉堆)的结构,每个点的值构成1~n的排列,即每个点的值都是1~n之间的整数,且任意不同的两点的值不同。根据堆的定义,每个点的值大于它的所有子节点。
现在已知其中k个点的值,你需要回答是否存在这样的堆,即是否可能填上剩下n-k个点的值,使得每个点的值是1~n的排列,并且满足每个点的值大于子节点。
你需要分别判定T棵堆。
输入
第一行一个正整数T。接下来有T组数据。
每组数据第一行两个正整数n
第二行n个整数,表示这个堆上每个节点的父亲fi,如果fi=0表示根是i
第三行n个整数,表示每个节点的值vi,如果vi=0表示该节点的值未知
输出
T行,第i行表示第i组数据是否存在这样的堆,如果存在,输出1,如果不存在,输出0。
样例输入 复制
2
5
0 1 2 3 4
5 4 3 1 2
13
0 1 1 1 2 2 2 3 3 4 4 8 8
13 7 9 0 0 0 0 3 0 0 0 0 0
样例输出 复制
0
1
提示
【范围】
对于40%的数据,树是一条链,即第i条边连接i和i+1
对于100%的数据,T<=100 n<=10^4
【提示】
输入量较大,请采用较快的读入方式,避免使用没有关闭流同步的cin。