数列的操作,我们有很多算法,例如线段树、树状数组、st表等等。它们的时间复杂度都是log级别的。这种高级数据结构是很优美也很实用的。但是我们避不开一个问题,就是内存空间。但是我认为最大的问题还是可实现度,也可以说好不好写。线段树的代码相对而言是比较难写的,占用空间相对较大。在一般数列操作上 ,我们可以尝试引入分块算法。
分块算法
分块,顾名思义就是将数列分成一块一块的来处理来维护。我们可以利用一个例题来讲解分块的原理。
例题:给定一个长为n的数列,以及n个操作,操作涉及区间加法,单点查值。
假设你有学过树状数组或者线段树,可以知道这是一个最最基础的模板题。那么用分块应该怎么解决这个问题呢?
如果你学过上面两种高级数据结构,请抛开它们。假设你并不知道,你会用什么办法来解决呢?很显然,我们会用暴力的算法。也就是在区间加法的时候一遍遍扫过去更新每一个的值就好了。这种算法肯定是不能AC的,但是我们可以联想一下分块的性质。我们可以把数列分成一个又一个的块,在每一个块来用暴力的方法处理和维护。就可以降低很多的时间复杂度,你可能会觉得疑惑:就这? 是的,所以分块算法又称为“优雅的暴力”。用hzwer学长的话来讲:“数列分块就是把数列中每m个元素打包起来,以达到优化算法的目的。”
我们现在来介绍几个关键名词:
块:我们将数列划分成若干个不相交的区间,每个区间称为一个块 整块:在一个区间操作时,完整包含于区间的块 不