突然想起之前就想做的分块练习.
现在做起来真的感觉好傻逼啊.
分块暴力美学 有时候花里胡哨的数据结构出锅的时候也算是 一种补救方法吧.
分块代码不长也比较好写,根据hzwer的blog,分块时一定要想想这几个问题:
对于每次区间操作:
1.不完整的块 的$O(\sqrt{n})$个元素怎么处理?
2.$O(\sqrt{n})$个 整块 怎么处理?
3.要预处理什么信息(复杂度不能超过后面的操作)?
分块在大数据下很容易找出锅.
一般查错就分不同大小的块就好啦.
我贴完代码就跑!
分块入门1 区间加法 单点查值
没错 树状数组同学今天请你坐下!
1 | //my vegetable has exploded. :( |
分块入门2 区间加法 求区间小于c的元素个数
没错 树状数组同学您还是坐下吧
1 | //my vegetable has exploded. :( |
分块入门3 区间加法 查找前驱
1 | //my vegetable has exploded. :( |
分块入门4 区间加法 区间求和
其实多统计个sum信息就好了
1 | //my vegetable has exploded. :( |
分块入门5 区间开方 区间求和
就是利用一个数在有限次内(根据范围最多5~6次)一定可以被开方成1给整个块打标记
1 | //my vegetable has exploded. :( |
分块入门6 单点插入 单点求值
可以扔链表 但是分块我们可以资瓷更多的区间操作
本来的做法是找到新元素所在的块然后暴力向右移动
但是玩意所有操作都放在同一个块怎么办?
不难发现每次重构块是$O(n)$的
那么我们增加$\sqrt{n}$个元素就重构一次块 使得所有的块大小均衡
1 | //my vegetable has exploded. :( |
分块入门7 区间加法 区间乘法 单点询问
注意优先度就行
1 | //my vegetable has exploded. :( |
分块入门8 区间修改 区间询问
挺傻逼的.
1 | //my vegetable has exploded. :( |
分块入门9 区间众数查询
离线版本不难想到
但似乎可以在线资瓷带修操作?
bzoj2724了解一下
1 | //my vegetable has exploded. :( |