poj 3321 Apple Tree

题意:

有一棵树,这棵树上有很多果子,一开始每个果子都在,给出下面两种操作:

1.C x,改变果子x的状态,如果有,那么久摘下来;没有,就变为有;

2.Q x,问在x上面的(包括x)有多少个果子。

思路:

多叉树,朴素的更新方法就是从叶子到根的路径上的点的值全部更新,但是这样每更新的复杂度是O(n)。

所以就要考虑如何较快地更新。

树状数组的更新是logn,那么就要考虑如何把树上的问题转换为区间的问题,这就用到了dfs序。

“一棵子树的dfs序就变成了一个区间”

通过记录dfs序,那么一个节点及其子节点就构成了一段连续的区间,所以就可以用树状数组进行信息的维护。

对于这道题来说,对于每一个节点,记录两个信息,一个是第一次访问到它的时间l,第二个是它的子节点中最大的访问时间r,那么从l到r这一段连续的数字就是这个节点及其所有子节点的区间。

更新x,就是将l[x] ~ n这一段区间更新;

查询x上面的数字之和,就是查询1 ~ r[x] 与 1 ~ l[x]-1的差值。

这两个操作就是树状数组的基本功能,单点更新与区间查询。

注意建树不能用vector,得用链式前向星。

代码:

Original: https://www.cnblogs.com/kickit/p/9077354.html
Author: qrfkickit
Title: poj 3321 Apple Tree

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/604631/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球