分块算法是一种较高效的暴力方法,他的思想如下:
如名,它将一个序列分为多段的形式,并将这些段重新分划出一个所属空间,在区间问题求解的时候我们可以整段整段的去求解,而由于我们所面对的区间问题时常是一对很灵活的值,所以我们再求解的时候一般都是先求这个所求区间中所能保留的完整的段,然后在向左向右微调,显然的,时间复杂度根据这个块数,和块以内元素的个数有关。
设序列长度为 n ,我们时常将块的个数设为,则某一块的个数也为
(但是在一个数无法数理开方的时候,会还剩左右两个不规则的块,一般需另算),那么对于区间或单点的修改,他的时间复杂度就是小于等于o(
)的。
不同于线段树与树状数组的是,它的单点修改只对与其对应的块产生影响,所以如果边界值控制得当或者题目暗示给出所修改元素是第几个,则这个修改的复杂度是o(1)的,但对于区间操作,我们得严格控制边界。即:寻找对应区间 -> 对应区间更改对应值 -> 保留状态并得解,事实上只有前两个操作花了我们时间。也就是能够保留得完整得区间个数 + 两边微调的个别元素的个数 综合下来复杂度为,如果类似的,我们给出懒惰标记,然后最后离线求解,则时间复杂度将得到更大的优化。