【基础操作】整体二分概述

整体二分是一个常数小的离线做法。

这篇讲 $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$。

题解

其实也是个整体二分模板题。

后记

其实大部分整体二分的题目都完全可以用纯数据结构(比如主席树)代替,写整体二分只是为了减小常数。

了解一下,会写就好了。

猜你喜欢

转载自www.cnblogs.com/scx2015noip-as-php/p/whole_dichotomy.html