线段树分治技巧
一
经典的线段树分治题目,每个修改的影响是一段固定的时间,这时我们可以将这种影响拆分到线段树的 \(\mathcal O(\log n)\) 个节点上,从而省去大量重复操作。
因为需要所有区间的信息,这是一种离线算法。
或许有一些操作信息不完整,我们需要合适的分治顺序进行‘在线’的补全修改信息。
我们将修改染色的端点之间的段放到线段树上,注意不包含端点
我们在分治到 \(l\) 的时候,可以得到当前操作时的连通性,自然可以判断是否进行染色:
染上去了,则颜色是新颜色。
没染上去,则颜色是上一次染色的颜色。
上一题我们还至少知道操作的影响区间,这道题可什么都不知道了
但是,我们至少可以发现,一条边对答案的贡献肯定是从它出现开始到另一条边把它干掉,也就是说,影响区间的左端点是固定的。
如果从右至左遍历,我们发现在叶子新加入的边恰好是这条边的结束区间。
那么我们分治时先递归右子树即可。
注意覆盖时应该是 \([l,r)\),否则区间可能被打在当前节点的上方。
二
当操作对答案的贡献是独立的时候,可以考虑每层单独计算而不维护上层的信息。
这样的好处在于不用撤销,本质上与 cdq 分治类似。
维护凸包这类信息时可以在提前排序再拍到线段树上,可以做到 \(\mathcal O(n \log n)\) 的复杂度。
比如维护点积最大值。