分块
什么是分块?
分块,顾名思义,就是把数组分成很多块,对于每次寻问,对每块单独进行求解,再求出散块,最终的答案就是每块的答案的并。
在信息学中,我们通常将分块定义为把一个长度为
分块优势
分块思想在一些情况中有着较好的应用。当出现下列情况时,将一个问题分解为若干个规模较小的子问题,也就是进行分块,会是较优的策略:
- 如果子问题的规模很小,可以设计关于子问题规模的复杂度较高的算法;
- 如果子问题的数目很少,可以对每类子问题使用复杂度与整个问题规模有关的算法;
- 如果每个子问题内部的元素具有共同的性质,可以使用针对性的算法。
如何分块?
我们可以把整个数列数列分为每块长度为
例子:序列元素数目
分割时,如果分的块数过多,虽然散块会较短,但会导致合并答案的时候速度太慢,如果分的快过少,虽然分得块数较少,但是每块过长,同时头尾的散块也会过长,降低效率,所以说,如何分块,每块长度
设
- 块的数目不超过
N/S+1 。 - 对于任意区间
[L,R] , 可以分解成若干个完整的块以及剩余的不超过2S 个元素。
修改与查询
分好块之后,如果我们能在块的层次上概括块内元素的信息,并且可以快速将不同部分的信息合并,就能够快速地得到任意区间的信息,也就是询问了。
对于每次询问
在上图中,对于
对于修改操作,我们也可以使用上述方法,散块单独修改,整块进行统一修改即可。
时间复杂度分析
将序列分块,令每块的大小为
首先,预处理的复杂度为
对于询问操作,只需计算出询问区间对应的完整的块与多余的元素的和,时间复杂度为
对于修改操作,也是
对于
但是,不是所有的分块时间复杂度都是