题目描述
有一棵包含 N 个节点的树,节点编号为 0,1,…,N−1。节点 0 是根。对于每个 i>0,节点 i 与节点 parenti 之间有一条边。
初始时,节点 0 上放有一个红色棋子,另外一些节点上放有黑色棋子。每个节点至多放一个棋子。数组 token 描述初始状态:tokeni=1 表示节点 i 上有棋子,tokeni=0 表示该节点为空。保证 token0=1,且节点 0 上的棋子就是红色棋子。
一次操作中,如果一个有棋子的节点与一个空节点相邻,你可以把该棋子沿边滑到这个空节点上。
对于每个节点 i,请判断是否存在某个合法操作序列,使红色棋子最终到达节点 i。
输入格式
第一行输入一个整数 N。
接下来 N 行,第 i+1 行输入两个整数 parenti,tokeni。
其中 parent0=−1,其余 parenti 表示节点 i 的父亲;tokeni∈{0,1} 表示节点 i 初始是否有棋子。
输出格式
第一行输出整数 N。
第二行输出 N 个整数 ans0,ans1,…,ansN−1。若红色棋子可以到达节点 i,则 ansi=1,否则 ansi=0。
数据范围
2≤N≤300。
parent0=−1;对于每个 i>0,有 0≤parenti<i。
token0=1,并且对每个 i>0,tokeni∈{0,1}。
样例
输入
5
-1 1
0 1
0 0
0 0
1 1
输出
5
1 1 1 1 0