CF877E Danil and a Part-time Job
题目描述
Danil 决定去赚点钱,于是他找到了一份兼职工作。面试进展顺利,现在他成了一名开关灯工人。
Danil 在一棵有根树(无向、连通、无环图)中工作,这棵树有 $n$ 个结点,第 $1$ 号结点是树的根。每个结点代表一个房间,每个房间的灯都可以被打开或关闭。Danil 的工作内容是切换某个结点子树内所有房间的灯的状态。也就是说,如果子树中某个房间的灯是开着的,他需要关掉它;如果是关着的,则需要打开它。
然而(也许很幸运),Danil 非常懒惰。他知道老板不会亲自来检查工作,而是会通过 Workforces 的私人消息派送任务给他。
任务分为两种类型:
1. pow v 表示要切换以结点 $v$ 为根的子树内所有房间灯的状态。
2. get v 表示要统计以结点 $v$ 为根的子树中亮着灯的房间数量。Danil 需要通过 Workforces 回复老板答案。
一个结点 $v$ 的子树,指的是树中从这些结点到根的最短路径都会经过 $v$ 的所有结点。特别地,$v$ 本身一定属于自己的子树。
Danil 不打算认真工作。他请求你编写一个程序,代替他回复老板的消息。
输入格式
第一行包含一个整数 $n$($1 \leq n \leq 2 \times 10^5$),表示树的结点数。
第二行包含 $n-1$ 个用空格分隔的整数 $p_2,p_3,\ldots,p_n$($1 \leq p_i < i$),表示结点 $i$ 的父结点编号。
第三行包含 $n$ 个用空格分隔的整数 $t_1,t_2,\ldots,t_n$($0 \leq t_i \leq 1$),其中 $t_i = 1$ 表示结点 $i$ 的房间的灯是开着的,$0$ 表示是关着的。
第四行包含一个整数 $q$($1 \leq q \leq 2 \times 10^5$),表示任务数量。
接下来 $q$ 行,每行一个 pow v 或 get v($1 \leq v \leq n$),表示一项任务。
输出格式
对于每个 get v 任务,输出以结点 $v$ 为根的子树中亮着灯的房间数量。
说明/提示
这是执行 pow 1 操作前的树。
这是执行 pow 1 操作后的树。
由 ChatGPT 5 翻译