数列分块入门 1~9
数列分块入门 1
区间加法,单点查询
完整的块更新标记,不完整的块暴力更新 $ O(q\sqrt{n} ) $
数列分块入门 2
区间加法,查询区间内比 x 小的数的个数
每个块内排序一下,查询二分一下 $ O(q\sqrt{n}\mathrm{log}n) $
数列分块入门 3
区间加法,查询区间内 x 的前驱
每个块内维护一下,查询二分一下 O ( q n l o g n ) O(q\sqrt{n}\mathrm{log}n) O(qnlogn)
也可以用 set
数列分块入门 4
区间加法,区间求和
维护一下块的和 O ( q n ) O(q\sqrt{n}) O(qn)
数列分块入门 5
区间开方区间求和
我们发现开根多次后每个数都会变成 1,变成 1 之前暴力修改就可以 $O(kn + q\sqrt{n}) $
数列分块入门 6
单点插入 单点询问
我们把初始的数列拆成长度为 n \sqrt{n} n 的块,维护每块的长度
每次插入时在块内暴力插入,如果一个块的长度超过了 2 n 2\sqrt{n} 2n 那么我们将它拆成两块 O ( q n ) O(q\sqrt{n}) O(qn)
数列分块入门 7
区间乘法 区间加法 单点询问
像线段树一样维护标记就可以了 O ( q n ) O(q\sqrt{n}) O(qn)
数列分块入门 8
每次区间询问等于 x 的数的个数,并将这个区间的所有数改为 x
如果一个块内的数都不同的话,就暴力的查询块,这样每次询问最多打乱两个块 O ( q n ) O(q\sqrt{n}) O(qn)
数列分块入门 9
询问区间最小众数
一段区间的众数可能是 所有完整块内数的众数 或者 不完整块中的数
那我们可以对每对 i, j 预处理出第 i 块到第 j 块的众数
这样每次询问我们只需要查询 n \sqrt{n} n 级别的数在区间内出现的次数就可以了
我们可以离散化后用 vector 存下每个数出现的位置,然后二分就可以了 $ O( n\sqrt{n} + q\sqrt{n}\mathrm{log}n) $