复习:整体二分

整体二分,正如其字面含义就是“批量对多个询问二分”。

常见的应用场景是,我们有 \(n\) 个元素和 \(m\) 个询问,答案具有单调性,即可以用二分解决。但每次 check 一个 mid 可能是 \(\mathcal O(n)\) 的。

考虑另外一个暴力的方法:从小到大枚举答案,并预处理 check 所需的信息,这个过程通常是均摊近线性的。然后一次枚举每个询问,第一次 check 成功的位置就是询问的答案。

结合上述两个方案。由于答案具有单调性,不妨把“从小到大”枚举答案,改为二分答案,即对 mid 预处理信息,然后 check 每个询问,划分到两侧递归。此时复杂度即为近线性。

一般而言有两种写法,各有优劣:

  • 把元素和查询一起递归,往右递归的查询要减掉往左递归的元素的贡献,需求信息具有可加性。优点是可以带修改,把修改当做元素一起递归即可。
  • 如果对修改的限制形式是一个前缀,可以直接用持久化数据结构维护前缀信息。优点是信息不需要可加,如连通性等。此时可以退化为对每个查询分别二分。缺点是不能带修改,否则 二分指标 和 时间 构成两维偏序,不再满足前缀形式。
  • 对上一种写法而言,如果空间或者实现复杂度限制无法持久化,也可以通过指针维护前缀信息,需要支持撤销,有结论指针移动总次数 \(n\log n\)。

p3527 MET-meteors

每个位置有一个颜色。每个颜色有阈值。若干次区间加,要求报告每种颜色对应的位置的和第一次超过阈值时的操作编号。

  • 二分:第一次超过的时间,则对象为操作序列上的一段前缀。
  • 信息:\(\le \text{mid}\) 的操作的和,放到线段树上。
  • 查询:枚举所有该颜色的点,求和并判定是否超过阈值。

这里信息既可加也可撤销,形式也是一段前缀。可以使用写法 I,复杂度 \(\mathcal O(n\log^2 n)\)。

值得注意的是写法 II 中,操作是区间加,只需要单点求和,可以外层排序中途按顺序下传,区间加拆成端点差分,维护时双指针求前缀和,即可做到单层线性,复杂度 \(\mathcal O(n\log n)\)。


p4602 混合果汁

有多种果汁,每种果汁有 美味度、单价 和 总量限制,记一个购买方案的美味度为使用到的果汁的美味度最小值,价格与体积按求和记。多次询问给定 预算 和 阈值,在体积达到阈值的基础上,最大化美味度。

  • 二分:最小美味度,则对象为按美味度排序后的一段后缀
  • 信息:所有美味度 \(\ge \text{mid}\) 的果汁,放在按 单价 维护的值域线段树上。
  • 查询:在值域线段树上从小往大贪心购入单价更低的果汁。

这里信息不太可加,意味着我们需要左侧的元素的信息。而撤销是简单的。用方法 I 维护即可做到 \(\mathcal O(n \log^2 n)\)。


p2617 dynamic rankings

单点修改,询问区间第 \(k\) 大。

二分,转化为 \(\#\set{x\le \text{mid}}\ge k\)。

可以发现,这里贡献是和的形式,并且带修改,方法 II 维护即可。


p7472 天天爱射击

给出若干个区间,每个区间有一个阈值,多次操作给出一个位置,将所有包含该位置的区间权值 \(+1\),问每个区间权值第一次超过阈值的时刻。

二分第一次超过阈值的时刻,对象为操作序列上的一段前缀。
维护单点加区间和即可。

直接做到 \(\mathcal O(n \log^2 n)\)。


p3250 网络

给定一颗树,支持多次加入/撤销带权的路径,或者给出 \(x\),询问不包含 \(x\) 的路径权值最大值。

  • 二分:check 是否所有 \(\ge\text{mid}\) 的路径都覆盖 \(x\),指标是权值。
  • 信息:所有 \(\ge\text{mid}\) 的路径覆盖次数。
  • 支持路径加单点查。

撤销直接看作贡献 \(-1\) 次即可。

路径加单点查可以拆成 dfn 序区间加单点查。

信息可加,用方法 II 维护,\(\mathcal O(n\log^2n)\)。


agc002D

无向图边按顺序加入,每次询问 \((x, y, z)\),报告最早何时 \(x,y\) 所在连通块大小之和 \(\ge z\)。

  • 二分时间,对象是边按时间排序后的一段前缀。
  • 信息:维护加入时刻 \(\le\text{mid}\) 的点的连通性相关信息。
  • 查询直接判定是否位于一个连通块内,利用连通块相关信息即可。

这里信息是连通性,贡献不可减。

用带撤销并查集即可做到 \(\log n\) 每次合并。

套用写法 I 即可,复杂度 \(\mathcal O(n \log^2 n)\)。


p3242 接水果

树上有若干带权路径,每次给出一条路径,询问被这条路径完全包含的路径中权值第 \(k\) 大。

这题重点主要是如何刻画路径互相完全包含。从 \(I\) 刻画一个路径 \(I'\subseteq I\) 比较困难,考虑如何对 \(I'=(x,y)\) 刻画。

若 \(I'\) 是直链,那么 \(I\) 一端属于较深点的子树,另一端不属于较浅点的子树,拆成两个矩形。否则 \(I\) 两端各属于 \(I'\) 其中一端点的子树。

那么拆成矩形后扫描线+整体二分维护即可。复杂度 \(\mathcal O(n\log^2 n)\)。


p7274 草地

posted @ 2026-10-27 12:13  CuteNess  阅读(10)  评论(0)    收藏  举报