线段树分治技巧

经典的线段树分治题目,每个修改的影响是一段固定的时间,这时我们可以将这种影响拆分到线段树的 \(\mathcal O(\log n)\) 个节点上,从而省去大量重复操作。

因为需要所有区间的信息,这是一种离线算法。

或许有一些操作信息不完整,我们需要合适的分治顺序进行‘在线’的补全修改信息。

CF576E Painting Edges

我们将修改染色的端点之间的段放到线段树上,注意不包含端点

我们在分治到 \(l\) 的时候,可以得到当前操作时的连通性,自然可以判断是否进行染色:

染上去了,则颜色是新颜色。

没染上去,则颜色是上一次染色的颜色。

CF603E Pastoral Oddities

上一题我们还至少知道操作的影响区间,这道题可什么都不知道了

但是,我们至少可以发现,一条边对答案的贡献肯定是从它出现开始到另一条边把它干掉,也就是说,影响区间的左端点是固定的

如果从右至左遍历,我们发现在叶子新加入的边恰好是这条边的结束区间。

那么我们分治时先递归右子树即可。

注意覆盖时应该是 \([l,r)\),否则区间可能被打在当前节点的上方。

当操作对答案的贡献是独立的时候,可以考虑每层单独计算而不维护上层的信息。

这样的好处在于不用撤销,本质上与 cdq 分治类似。

维护凸包这类信息时可以在提前排序再拍到线段树上,可以做到 \(\mathcal O(n \log n)\) 的复杂度。

比如维护点积最大值。

posted @ 2022-04-08 22:22  chihik  阅读(28)  评论(0编辑  收藏  举报