分块 1
分块
分块的基本思想:
以空间换时间和平衡时空复杂度
用处:维护区间信息
同线段树相比,分块的时间复杂度要高一些,换来的是灵活性和通用性
(当然更难调......)
根号分块
这里是已知用分块的时空复杂度去算块长,假定块长为 \(K\)
这里的原理就是上边说的平衡时空复杂度
其实最主要的应用位置就是多项式中多项和块长相关的的情况
蒲公英
维护区间众数,线段树废了(众数不满足区间可加性)
法一
预处理所有以段边界为端点区间的众数及每个点的次数
显然区间总数\(\frac{K^2}{2}\)
维护好这一段以后剩下的就是暴力维护不在整区间的部分
记得还原现场
这样,预处理时间复杂度就是\(O(NK^2+MN/K)\)
当然,\(M,N\)同数量级\((4e4)\)
平衡一下,\(K^3=N\),就是块长\(K=\sqrt[3]N\)
法二
存每个块众数和这些众数的位置,然后二分块找到位置相减
这时的块长约为\(\sqrt{NlogN}\)
整数分块
如果懒得算块长,那么省点事把块长开成一个固定值,就是整数分块
弹飞绵羊
分块,块长\(K=\sqrt{N}\)
此时时间复杂度约为\(O(N^\frac{3}{2})\)
显然这样不太体现我们的特殊性
所以我闲的大力卡了一波块数......
UPD:
然后就没有然后了
不要随便调块长
然后其实还有一些除了线性这种常见的形式,还有树上分块...
一听就知道是老毒瘤了
然后还有就是特判操作端点在同一块的情况!
(4.19吃了两个Hack......)