分块笔记-根号平衡

利用分块结构,我们可以进行根号平衡,在特殊的情况下可以优化复杂度,如平衡修改和查询的复杂度

(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})个值的所在块
  • 查询时定位位置即可
原文地址:https://www.cnblogs.com/hangzz/p/13257442.html