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条边连接ii+1

对于100%的数据,T<=100 n<=10^4

 

【提示】

输入量较大,请采用较快的读入方式,避免使用没有关闭流同步的cin