分块思想
分块思想是对原数据适当的划分,并且在划分后的每一个块上预处理部分信息,从而优化算法。
大体思路就是:
- 对于给出的序列按照固定的块长
进行分块,预处理出每个块中询问的信息
- 在询问时,答案可以分为三部分:中间完整的块,左端点所在不完整的块,右端点所在不完整的块。对于第一种,通过上一步预处理的信息直接获得答案。对于第二种和第三种,暴力遍历一遍区间求得答案。
- 假设块长为
,那么询问时,第一种的时间复杂度为
或
,后两种的时间复杂度为
。整体时间复杂度为
很经典的数列分块入门题
值域分块思想
- 当序列的数都
时一般都可以用值域分块
- 用来统计区间里有多少个数的值在固定区间
里
- 一般和莫队结合使用
题目解析
luoguP4867 Gty的二逼妹子序列
点击跳转
- 对于区间问题不难想到离线算法的莫队,但是莫队没有办法维护权值的范围,考虑再套一种数据结构。
- 由于
并且没有修改操作,进行值域分块,注意一些计算贡献的小细节,时间复杂度
luoguP4396 [AHOI2013]作业
点击跳转
- 跟上题一样,再多开一个数组维护数的个数就好了
LOJ6285.数列分块入门 9
点击跳转
- 一个很经典的题,求众数离线可以莫队,在线可以分块;
- 按照一般的思路去想,分块后的答案来源
- 左端点
所在块的众数,右端点
所在块的众数,
到
的块的众数
- 对于每一种可能,我们都统计出现的次数,最后更新答案就好;
- 可以用一个
存储每个数出现的下标,计算每个数在某个区间的出现次数就可以二分找。
- 由于
的范围过大,需要离散化。要注意离散化后统计答案的过程,有一些细节;
- 那么前两种可能性我们都可以直接枚举每个数出现的次数,第三种呢,枚举显然不现实;
- 预处理出
表示第
块到第
块的众数,时间复杂度
牛客 仓鼠与珂朵莉
点击跳转
- 跟上题区别不大,多乘一个价值就好了
- 注意强制在线
的处理
CF455D Serega and Fun
点击跳转
- 考虑操作
对操作
的影响,分块后每次移动的时候,只有首项跟尾项元素会对答案产生影响。对每个块多加个deque维护一下。
- 由于
,对每个数都记录一下出现的次数,还要维护
表示第
块里
出现的次数;
- 更新的时候,注意处理整块与非整块的关系
牛客 小 Q 与彼岸花
题解
题解
- 对于最大异或值一般的解法都是放到
字典树上去跑,这题也不例外。但是对于
个询问来说,每次都对于
重新建立字典树显然时间和空间都不允许,所以这时候就可以用可持久化字典树来查询
的字典树啦
- 这样的话时间也还不是很够,考虑再怎么进行优化。可以进行分块操作,因为整块区间的值都是固定的,设
表示第
块到第
块之间的任取两个数的最大异或值,这个显然可以预处理出来。借鉴分块求区间众数的预处理思想,时间复杂度为
- 对于查询,考虑答案的构成:中间整块的最大异或值,左端点所在非完整块的最大异或值,右端点所在非完整块的最大异或值;第一种就是预处理的
数组的值,后两种可以枚举每一个数,贪心的在
的字典树上查找最大异或值,时间复杂度为
强化版
一些有用的链接
Codeforces 455D 学长题解 仓鼠与珂朵莉 学长题解 分块入门 渊佬题解 分块入门 涛巨题解
待补的题
~