GESP编程共123题,本题是整站第1421题,已经有人完成了本题,加油!
小杨有⼀棵包含 n 个节点的二叉树,且根节点的编号为 1。这棵二叉树任意⼀个节点要么是白色,要么是黑色。之后小杨会对这棵二叉树进行 q 次操作,每次小杨会选择⼀个节点,将以这个节点为根的子树内所有节点的颜色反转,即黑色变成白色,白色变成黑色。
小杨想知道 q 次操作全部完成之后每个节点的颜色。
第⼀行一个正整数 n,表示二叉树的节点数量。
第二行 (n−1) 个正整数,第 i(1≤i≤n−1)个数表示编号为 (i+1) 的节点的父亲节点编号,数据保证是⼀棵二叉树。
第三行一个长度为 n 的 01 串,从左到右第 i(1≤i≤n)位如果为 0,表示编号为 i 的节点颜色为白色,否则为黑色。
第四行⼀个正整数 q,表示操作次数。
接下来 q 行每行⼀个正整数 ai(1≤ai≤n),表示第 i 次操作选择的节点编号。
输出一行一个长度为 n 的 01 串,表示 q 次操作全部完成之后每个节点的颜色。从左到右第 i(1≤i≤n) 位如果为 0,表示编号为 i 的节点颜色为白色,否则为黑色。
输入 #1
6 3 1 1 3 4 100101 3 1 3 2
输出 #1
010000
第一次操作后,节点颜色为:011010
第二次操作后,节点颜色为:000000
第三次操作后,节点颜色为:010000
子任务编号 | 得分 | n | q | 特殊条件 |
---|---|---|---|---|
1 | 20 | ≤10^5 | ≤1^05 | 对于所有 i≥2,节点 i 的父亲节点编号为 i−1 |
2 | 40 | ≤1000 | ≤1000 | |
3 | 40 | ≤10^5 | ≤10^5 |
对于全部数据,保证有 n,q≤10^5。
【题目大意】
给定一棵有向树,同时给定q次操作,每次操作将x所在的子树每个节点颜色取反,问q次操作后的每个节点的颜色,数据范围为105.
【考纲知识点】
树上DFS,树形DP
【解题思路】
①比较朴素的思路为建树,每次操作时执行DFS,将操作的结果处理,最终输出每个节点颜色,极端情况下每次操作遍历整棵树的话,复杂度O(nq),只能解决40%的数据。
②考虑到程序只要最终结果,因此中间结果没必要完全求得,取反操作的周期为2,具有奇偶性,因此每次操作X时,将X的位置打个标记,表示其将影响X下方的每个节点翻转一次,当所有操作标记完,执行DFS,从root=1出发,统计到达每个节点X时的标记的数量cnt,如果cnt为奇数,则改点颜色取反,否则保持原来颜色。这样只需要O(n+q)的复杂度。
参考程序
本站题目仅供学习,GESP版权归CCF所有,如有侵权请联系删除。站长陈老师QQ及微信:208234。