感觉分块是一种很蛋疼的算法,但据说有的时候很好用 ( 分块算法可以维护一些线段树维护不了的东西,例如单调队列等,线段树能维护的东西必须能够进行信息合并,而分块则不需要 )。
分块算法很多时候会把复杂度优化一个O( )。
优化方式如下
一个规模为n 的问题,
我们将其变得有序,
令 x=
那么 我们可以将其划分为 块区域,分别为 [1 x] [x+1 2x] [2x+1 3x] ……[kx n]。
对于每一块 我们会对其添加某些标记
有两种修改方式或查询方式
单点查询或修改
修改为例
我们找到要修改的点,修改它,往往会影响到这个块之后的元素,不要犹豫暴力全修改。然后还会影响之后的块,不要犹豫,暴力修改,但是不是修改所有的点,而是修改之后所有块的标记值。
咱们算一下复杂度,修改块内O( ) 修改其他块O() 所以一次修改的期望O()。全暴力的话O(n)
区间修改查询
还是以修改为例
假设修改的区间为[l r], 找到l点,找到r点,从l往右修改,直到本块的最后一个元素,或者碰到r,结束第一轮的修改;向右整块修改(修改标记),直到遇到r所在块,结束第二轮的修改;继续向右直到r,结束第三轮的修改
精炼点说:如果是区间[L,R]修改的话,对于被[L,R]整块跨过的块直接打标记,两端剩余的部分暴力重构块的状态即可
复杂度还是O();