分块笔记-根号平衡
利用分块结构,我们可以进行根号平衡,在特殊的情况下可以优化复杂度,如平衡修改和查询的复杂度
\(O(\sqrt{N})\)单点修改,\(O(1)\)查询区间和
- 首先思考\(O(N)\)单点查询\(O(1)\)查询区间和(这是重要的思考方式),我们可以维护一个前缀和数组
- 同样的,在块内,快外分别维护前缀和,每次修改更新\(\sqrt{N}\)个前缀和,每次查询就把块内快外的前缀和加起来就行了
\(O(1)\)单点修改,\(O(\sqrt{N})\)查询区间和
- 维护块内和,每次修改块内和和该位置的值
\(O(\sqrt{N})\)区间加,\(O(1)\)查询单点值
- 直接分块,在块上大区间加标记
\(O(1)\)区间加,\(O(\sqrt{N})\)查单点
- 维护差分数组即可
\(O(1)\)插入一个数,\(O(\sqrt{N})\)查询第k小
- 值域分块,维护区间加
\(O(\sqrt{N})\)插入一个数,\(O(1)\)查询第k小
- 仍然用值域分块,维护每个数在那个位置,保证每个块内为\(\sqrt{N}\)个元素(最后一个除外)并有序
- 每次查询修改\(\sqrt{N}\)个值的所在块
- 查询时定位位置即可