整体二分是一个常数小的离线做法。
这篇讲 $CDQ$ 的文章里提到了其一个分支——整体二分。
整体二分的适用性
有一些问题,在有多组操作(一开始赋初值也算操作)但只有一组询问的情况下(当然这组询问正常情况下就放在最后的,不然它后面的操作是摆着玩的),可以二分这个询问的答案。
二分的时间复杂度是 $O(log(n))$,验证一个答案是大了还是小了的时间复杂度是 $O(n)$(或者是这个级别的,差不多不到 $O(n^2)$ 就行),总时间复杂度是 $O(n\times log(n))$(或者是这个级别的)。
对于很多组询问的情况,设询问组数为 $Q$,如果对每组都二分,时间复杂度是 $O(Q\times n\times log(n))$ 级别的,对于祖传数据(全 $100000$)直接升天。
然后我们发现,有一些问题的修改对询问的影响非常有特性,支持高效维护和查询。这时候就可以把所有操作(包括修改和查询)放到一块二分。
总之,整体二分只能在满足以下条件的情况下使用:
- 单组询问可以二分
- 存在高效的数据结构维护修改对询问的影响(了解整体二分的应该知道,像区间修改这种的就不存在)
- 题目可以离线做(废话)
……
主席树(模板)
题意
询问静态区间第 $k$ 大。$n,q\le 200000$。
题解
其实也是个整体二分模板题。
后记
其实大部分整体二分的题目都完全可以用纯数据结构(比如主席树)代替,写整体二分只是为了减小常数。
了解一下,会写就好了。