分块笔记-根号平衡

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

\(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}\)个值的所在块
  • 查询时定位位置即可
posted @ 2020-07-06 20:53  行zzz  阅读(431)  评论(0编辑  收藏  举报