分块学习笔记
前言:
分块——高级的暴力。采用的主体思想是“整块打标记,散块打暴力”。能解决很多线段树,平衡树,树套树等数据结构类问题,复杂度高但常数很小,可以和一些大常数的双log甚至单log数据结构持平,且思维相对简单,缺点是码量较大,需要一定的代码能力。
上篇——静态分块
区间分块
最简单的东西,感觉也是变化最多的东西
把数组分成
分块开不开结构体都可以,一般需要对每个块维护
值域分块
分块的进阶版,在区间分块的基础上对值域分块,为了保证修改和查询时正确的复杂度,一般采用前缀和优化。即设
则修改和查询操作都可以分为:
值域分块可以解决一些诸如带修改区间第k小等原本需要树套树才能解决的问题,赢!
下篇——块状链表(动态分块)
“动态”不是指支持带修,这个普通分块也能做,但是块状链表可以支持带插入,即在序列的第
实现很简单,先分块,把原来分好的块用链表串联起来,也就是对每个块维护nxt,指向它的下一个块。遇到插入则暴力重构整个块。
注意在同一个位置插入过多的数会导致这个块长度远大于
特殊情况下也会需要一个
块链的写法是对每个块开一个结构体,存
这里简单说一下个人总结出的三种块链。
单点插入,全局查询
eg.P3369
最好写的块链,这类题不涉及元素的位置,可以直接维护一个有序的序列,通常要对每个块维护
单点插入,区间查询
eg.存储器,P4278
比较常见的块链,一般需要维护
有时候还可以搭配值域分块食用。
区间插入,区间查询
eg.P2042
比较难写的块链,个人觉得更像一种根号版平衡树(
我们稍微魔改一下
同时特别说一下区间反转,转化为一堆整块之后,把每个块打个
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通