专栏文章
题解:P11127 [ROIR 2024] 二叉树的遍历 (Day 2)
P11127题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minog7mm
- 此快照首次捕获于
- 2025/12/02 05:44 3 个月前
- 此快照最后确认于
- 2025/12/02 05:44 3 个月前
想了很久 polylog 做法无果,点开题解一看是全是根号做法,心脏骤停。
首先要对于点 ,大分讨 比 先遍历的情况。
-
为中序遍历, 在 的左子树。
-
为后序遍历, 在 的子树。
-
存在一个 的公共祖先 , 在 左子树, 在 的右子树。
这三种都可以预处理,因为第一、二种只关心 的操作状态,而第三种不关心点的操作状态。
-
为先序遍历, 在 的子树中。
-
为中序遍历, 在 的右子树中。
如果是单点修改,这两个也可以用树状数组简单做,但是这个是区间修改,在 dfs 序并不是一段连续的区间,很难做,只能考虑分块。
对于每个块维护数组 表示块内的点对 dfs 序为 的点(记为 )的影响,即有多少点在 前面,这样做是因为每个点的影响都是一个子树,子树点集在 dfs 序上是连续的。
注意到如果一个点是后序遍历,它不会对任何一个点产生影响,所以只考虑另外两种操作状态。
如果一个块内都是同一种操作状态,显然可以简单预处理维护,这要求修改区间完全包含它。
那么就考虑散块的情况,此时修改区间和它相交不包含,此时只能重构。
为什么重构复杂度是对的,每次修改至多需要重构两个散块。
此时需要构建一个新的 数组,块内的 个点都将对其进行区间加法。
那么就是一共 次修改, 次查询,用值域分块平衡一下复杂度即可(修改 ,查询 ),而散块共用同一个值域分块,整块可以 查,所以查询是 的。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...