[DS 小计] 线段树分治
很简单的一个小 trick 。就看能不能想出来。
思考
我们学过 CDQ 分治。
CDQ 分治的思想是把时间切割,询问截断点后面的问题,预处理截断点前面的贡献。
这是把问题和修改放在一起的。
那么,假设修改很难撤销怎么办?
这时候就可以用线段树分治做到只增不删。有点类似回滚莫队。
算法
直接给时间轴上一棵线段树。
运用标记永久化的思想,每个点存了时间 \([l,r]\) 的修改。
然后询问某个时间戳,遍历从根节点到叶子结点的所有修改就是当前时间戳的所有修改。
显然,遍历是 \(O(m)\) 的,做的修改操作均摊是 \(O(m\log m)\) 的(不计修改操作本身的情况下),查询与原问题去掉修改操作的问题是相同的。
总而言之,这是一个简化问题的 trick,去掉所有删除操作,解决子问题。
瓶颈一般在于单次修改的复杂度,令单次修改复杂度为 \(x\),单次查询时间复杂度为 \(y\) ,那么总的时间复杂度是 \(O(x\times m\log m+y \times m)\)
这和之后学习的线段树优化建图思想类似。