【知识总结】分块和值域分块

分块思想

分块思想是对原数据适当的划分,并且在划分后的每一个块上预处理部分信息,从而优化算法。
大体思路就是:

  • 对于给出的序列按照固定的块长 ( 一 般 为 n ) (一般为\sqrt n) (n )进行分块,预处理出每个块中询问的信息
  • 在询问时,答案可以分为三部分:中间完整的块,左端点所在不完整的块,右端点所在不完整的块。对于第一种,通过上一步预处理的信息直接获得答案。对于第二种和第三种,暴力遍历一遍区间求得答案。
  • 假设块长为 n \sqrt n n ,那么询问时,第一种的时间复杂度为 O ( 1 ) O(1) O(1) O ( n ) O(\sqrt n) O(n ),后两种的时间复杂度为 O ( n ) O(\sqrt n) O(n )。整体时间复杂度为 O ( n n ) O(n\sqrt n) O(nn )
    很经典的数列分块入门题

值域分块思想

  • 当序列的数都 < = 1 e 5 <=1e5 <=1e5时一般都可以用值域分块
  • 用来统计区间里有多少个数的值在固定区间 [ v a l l , v a l r ] [vall,valr] [vall,valr]
  • 一般和莫队结合使用

题目解析

luoguP4867 Gty的二逼妹子序列

点击跳转

  • 对于区间问题不难想到离线算法的莫队,但是莫队没有办法维护权值的范围,考虑再套一种数据结构。
  • 由于 1 < = a i < = n 1<=a_i<=n 1<=ai<=n并且没有修改操作,进行值域分块,注意一些计算贡献的小细节,时间复杂度 O ( n n ) O(n\sqrt n) O(nn )

luoguP4396 [AHOI2013]作业

点击跳转

  • 跟上题一样,再多开一个数组维护数的个数就好了

LOJ6285.数列分块入门 9

点击跳转

  • 一个很经典的题,求众数离线可以莫队,在线可以分块;
  • 按照一般的思路去想,分块后的答案来源
  • 左端点 q l ql ql所在块的众数,右端点 q r qr qr所在块的众数, b e l o n g [ q l ] + 1 belong[ql]+1 belong[ql]+1 b e l o n g [ q r ] − 1 belong[qr]−1 belong[qr]1的块的众数
  • 对于每一种可能,我们都统计出现的次数,最后更新答案就好;
  • 可以用一个 v e c t o r vector vector存储每个数出现的下标,计算每个数在某个区间的出现次数就可以二分找。
  • 由于 a i a_i ai的范围过大,需要离散化。要注意离散化后统计答案的过程,有一些细节;
  • 那么前两种可能性我们都可以直接枚举每个数出现的次数,第三种呢,枚举显然不现实;
  • 预处理出 d p [ i ] [ j ] dp[i][j] dp[i][j]表示第 i i i块到第 j j j块的众数,时间复杂度 O ( n n ) O(n\sqrt n) O(nn )

牛客 仓鼠与珂朵莉

点击跳转

  • 跟上题区别不大,多乘一个价值就好了
  • 注意强制在线 l , r l,r l,r的处理

CF455D Serega and Fun

点击跳转

  • 考虑操作 1 1 1对操作 2 2 2的影响,分块后每次移动的时候,只有首项跟尾项元素会对答案产生影响。对每个块多加个deque维护一下。
  • 由于 1 < = a i < = n 1<=a_i<=n 1<=ai<=n,对每个数都记录一下出现的次数,还要维护 c [ i ] [ j ] c[i][j] c[i][j]表示第 i i i块里 j j j出现的次数;
  • 更新的时候,注意处理整块与非整块的关系

牛客 小 Q 与彼岸花

O ( n 2 ) O(n^2) O(n2)题解
O ( n n ) O(n\sqrt n) O(nn )题解

  • 对于最大异或值一般的解法都是放到 01 01 01字典树上去跑,这题也不例外。但是对于 m m m个询问来说,每次都对于 [ l , r ] [l,r] [l,r]重新建立字典树显然时间和空间都不允许,所以这时候就可以用可持久化字典树来查询 [ l , r ] [l,r] [l,r]的字典树啦
  • 这样的话时间也还不是很够,考虑再怎么进行优化。可以进行分块操作,因为整块区间的值都是固定的,设 d p [ i ] [ j ] dp[i][j] dp[i][j]表示第 i i i块到第 j j j块之间的任取两个数的最大异或值,这个显然可以预处理出来。借鉴分块求区间众数的预处理思想,时间复杂度为 O ( n n l o g n ) O(n\sqrt n log n) O(nn logn)
  • 对于查询,考虑答案的构成:中间整块的最大异或值,左端点所在非完整块的最大异或值,右端点所在非完整块的最大异或值;第一种就是预处理的 d p dp dp数组的值,后两种可以枚举每一个数,贪心的在 [ l , r ] [l,r] [l,r]的字典树上查找最大异或值,时间复杂度为 O ( 2 n l o g n ) O(2\sqrt n logn) O(2n logn)
    强化版

一些有用的链接

Codeforces 455D 学长题解
仓鼠与珂朵莉 学长题解
分块入门 渊佬题解
分块入门 涛巨题解

待补的题

~

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆沙睡不醒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值