数列分块入门

数列分块入门 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(qn logn)

也可以用 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) $

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值