专栏文章
腾飞计划寒假第五课——根号分治&分块 2025/2/6
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqbeuct
- 此快照首次捕获于
- 2025/12/04 02:03 3 个月前
- 此快照最后确认于
- 2025/12/04 02:03 3 个月前
根号分治
设一个阈值 ,如果查询数值 就用一种方法处理(时间复杂度通常是约 ),如果 就用另一种方法处理(时间复杂度通常是 ),发现 取 时最优,总体复杂度 。
实际上是一种平衡复杂度的暴力算法。
P11287 [COTS 2017] 影响 Utjecaj
把把关键点挖了找连通块,把一个连通块缩成一个点,权值是连通块的大小。
设阈值 ,若点的度数小于 ,暴力找即可。否则设 表示度数第 大的答案,每次更新逐个更改。
没找到的题:
序列 ,每次给个 和 ,查询最小的 使得 。
设阈值 ,如果 和 的出现次数小于 ,双指针暴力即可。
如果其中一个大于 ,预处理 (),表示出现次数大于 的第 大的值和第 个值的最小距离。
枚举 ,, 和 是值为 的两个位置。
因为出现次数大于 的最多 个,所以时间复杂度是 。
P5901 [IOI 2009] Regions
设属于 的为红点,属于 的为绿点。处理树的 dfs 序,将区间差分成前缀,双指针处理出红点之间的绿点个数。双指针一个指红点,一个指绿点,只要指的绿点在指的红点左边,就往后找绿点,否则找下一个红点。
如果红点和绿点个数均小于 ,用以上类似的双指针查询即可。
如果 ,预处理 表示 到根节点有多少个出现次数第 多的点。
如果 ,预处理 表示 的子树中有多少个出现次数第 多的点。
P9809 [SHOI2006] 作业 Homework
当 暴力去找,否则二分比 大的下一个,比 大的下一个,比 大的下一个,……,时间复杂度 。
P4109 [HEOI2015] 定价
唐诗做法,分块打表,以 为一个块,整块预处理,散块暴力。
P3203 [HNOI2010] 弹飞绵羊
不带修可以预处理,将序列分成根号块,维护下一步跳出本块的那一步跳到哪个块距离多少。
每次修改只影响本块内的值,对该块重构即可。
P8572 [JRKSJ R6] Eltaw
非常简单?0pts 求条。
CF920F SUM and REPLACE
小势能线段树。
P7446 [Ynoi2007] rfplca
小红题。
类似弹飞绵羊,维护每个点往前跳出这个块的第一步,查询时整块就往前跳,如果跳到了一起,可能在此之前就到 LCA 了,暴力往后找,每次查询 。
一个块被修改 次之后就一定一步能跳出块,一个块修改的前 次和散块暴力重构, 个块,最多修改 次,每次修改时间复杂度 ,总体复杂度 。
树分块
条件:
- 属于同一块的节点之间的距离步超过给定块的大小
- 每个块中的节点不能太多也不能太少
- 每个节点都要属于一个块
- 编号相邻的块之间的距离不能太大
构造方法:
dfs,并创建一个栈,dfs 一个点时先记录初始栈顶高度,每 dfs 完当前节点的一棵子树就判断栈内的数量是否大于等于 ,时则将栈内所有新增点分为同一块,核心点为当前 dfs 的点,当前节点结束 dfs 时将当前节点入栈,整个 dfs 结束后将栈内所有剩余节点放到最后一个块。
除了最后一个块,其余块的大小都在 之间,最后一个块的大小在 之间。
P6177 Count on a tree II/【模板】树分块
bitset 每一位表示颜色 是否出现过,将两段路径或起来就是两端路径一共的值。
选一个深度最深的点,找到它的 级祖先的子树删掉,树变成 个块。
随神的是 倍数并且向下最深深度大于等于 的点来打关键点,会有 个关键点,从每个点向上的长度也是 。
预处理两两之间的答案,用 bitset 存储。每个关键点与离他最近的关键点统计答案,预处理时间复杂度 。
然后询问就变成里一个点到关键点加另一个关键点到另一个点,询问复杂度 。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...