分块 - 优雅地维护更一般的信息

I.综述&解释

自然,分块更加简单直接,就是对数据进行一定划分,对于大块进行维护,不成大块直接朴素。

更加通用,当然也更慢。

II.起源

这同样是要维护一段区间的信息。

我们牺牲了更多的效率,预处理一部分信息保存,这样我们尽可能地提高信息的使用率(尽管没有前两者高),但是更接近朴素,这就意味着更加通用。

对于一些甚至不满足区间可加性的数据(e.g. 区间众数),分块也可以通过在块上保存更多信息来进行处理。

但是线段树就不行了,如果在每个节点都建立数组,那么它不仅空间开销太大,时间也会变成O(NlogN)\operatorname O(N \log N),因为请注意,一般我们处理的数据都可以O(1)\operatorname O(1)相加的,可是这次我们要O(N)\operatorname O(N)相加了,这是不可接受的(线段树的分治意味着它必然不能选择其他块长,不过分块就可以控制这个长度来平衡)。

当然,还有扩展的分治——莫队算法,这种算法,对询问进行分块排序,朴素地从上一个询问移动到下一个询问,分块在此只是为了尽可能地平均分布各个询问,降低转移复杂度。

III.基操

  • 初始化(init)

初始化块的信息

  • 修改(modify)

中间有大块的直接修改,没有大块的暴力修改。

  • 询问(query)

中间有大块的直接累计答案,没有的暴力枚举累计答案。

posted @ 2023-07-09 11:55  haozexu  阅读(18)  评论(0)    收藏  举报  来源