利用分块结构,我们可以进行根号平衡,在特殊的情况下可以优化复杂度,如平衡修改和查询的复杂度
(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})个值的所在块
- 查询时定位位置即可