分块 学习笔记
目录
-
分块思想
-
分块基础操作
2.1
区间加、区间查询2.2
区间加、单点查询2.3
单点加、区间查询 -
各种分块思路
3.1 对序列分块
-
普通区间和
-
维护区间
大等
3.2 对值域分块
3.3 对操作分块
3.4 对树分块
-
-
莫队
-
定期重构
-
根号分治
正文
0.约定
一般地,设块长为
1. 分块思想
考虑将一个长度为
容易发现,分块本身维护的信息不需要有 可合并性,这是它优于线段树的地方。但是根号带来的复杂度仍然是瓶颈。2e5凭什么卡根号
2. 分块基础操作
2.1 区间加、区间查询
直接做即可。
2.2 区间加、单点查询
考虑维护差分数组,单点查询就变成了前缀和。
2.3 单点加、区间查询
考虑维护块内前缀和、整块的前缀和,每次中间的整块直接算而零散用块内前缀和算,修改把前缀和全改了就行。
3. 各种分块思路
3.1.1对序列分块-普通区间和
直接做。
3.1.2 维护区间 大等
对于ABC339G,对
计算复杂度,单次询问为
对于 P5356 同理,修改时暴力对块重构即可。
3.2 对值域分块
你发现值域分块其实就是序列分块拍到值域上,没啥区别。
3.3 对操作分块
考虑如果一些修改的影响可以直接计算,不妨对询问分块。
例题:CF925E、CF1588F、[APIO2019] 桥梁、 [HNOI2016] 最小公倍数、GDKOI2024 新本格魔法少女
3.4 对树拍平分块
考虑直接把树用 dfs 序拍平,然后可以方便地在上面维护子树信息。但仅限于子树,不如树剖,静态问题也一般用 dsu on tree 代替。至于树分块,应用较少,我也不会。
4. 莫队
概述
莫队算法是一种离线算法,普通莫队可以
普通莫队
首先考虑一种暴力:维护两个指针
但是这样可能导致指针移动过多,因此还是
将序列分块,按左端点所在的块排序,左端点相同则按右端点排序。这样能保证
struct query{ int l,r,id; }q[500005]; bool cmp(query a,query b){ return bel[a.l]==bel[b.l]?a.r<b.r:a.l<b.l; }
感性地证明一下:对于左端点相同的询问,右端点移动是
另一道题:高橋君
这题看似与区间不相关,实际上也可以用莫队。
莫队的本质是维护多个指针,不一定与区间相关,甚至 A+B problem 多组询问也可以用莫队。
对于这题维护指针
对于
对于
预处理一下组合数即可
注意事项
- 指针移动的顺序
为了防止出现指针右端点小于左端点的情况,不能随意调换四个循环。设第一步操作左端点,只有三种正确:l--,r--,r++,l++
、l--,r++,l++,r--
、l--,r++,r--,l++
。
- 奇偶化排序
当左端点相同时,如果左端点的块为奇数,右端点从小到大排序,否则从大到小排序。这样的话偶数块的询问可以在奇数块询问解决后,
bool cmp(query a,query b){ return a.l/bn==b.l/bn?(a.l/bn&1?a.r/bn<b.r/bn:a.r/bn>b.r/bn):a.l/bn<b.l/bn; }
带修莫队
莫队不只有区间查询,也可支持修改。
多加一维指针
排序方法参照原版莫队三个关键字排序。
带修莫队属于三维莫队,理论上块长取
括号序树上莫队
用 dfs 序。
莫队的在线化改造
5. 定期重构
用线段树1为例,每
例题:数列分块入门6
用 vector 存储,考虑当一个块大小超过
6. 根号分治(阈值分治)
考虑一个最简单的例题:对
发现一般的数据结构不好维护。所以根号分治产生。
对于
对于
加强版是 [Ynoi2011] 初始化。
大于
代码不难写,但是 |x| 卡常。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现