整体二分

整体二分

济南qbxt的意外收获

什么是整体二分:

  一般情况下,我们用的二分是对答案进行,但总会有这么一种情况要进行多次二分操作。所以,就有人发明了整体二分这种骚操作
  整体二分主要是把所有询问放在一起二分答案,然后把操作也一起分治。

什么时候用呢?

  1. 当你发现多组询问可以离线的时候。
  2. 当你发现询问可以二分答案而且check复杂度对于单组询问可以接受的时候。
  3. 当你发现询问的操作都是一样的的时候。

    其实就是题目允许离线,并且询问可以通过二分回答时,可以使用整体二分。
    现在我们想想:二分答案的时候,对于一个答案,是不是有无用操作,或有些操作贡献是不变的?

    比如二分一个时间,那么时间后面发生的操作就是没有用的,时间前面的贡献是不变的。
    二分一个最大值,比mid大的都是没用的,比mid小的个数是一定的。
    整体二分就是利用了这么一个性质。

    做法与时间复杂度分析:

      假设所有的询问按时间顺序构成序列 $ Q = (q_1,q_2\cdots q_p) $ ,所有询问,的答案都落在区间 $ [L_0, R_0]$ 当中。
      首先得到区间 $ [L_0, R_0] $ 的中点 $ mid $,将序列分成两个不相交的部分 $ Q_1,Q_2 $,满足 $Q_1 \cup Q_2 = Q $ ,
    序列 $ Q_1 $ 中所有询问的答案不超过 $ mid $ , $ Q_2 $ 中所有询问的答案全部大于 $ mid $ 。
      对 $ Q_1, Q_2 $ 递归执行以上步骤, 要求对于任意一个子序列 $ Q′ $ 和对应的区间 $ [l, r] $,将 Q′ 分成两部分的时间不超过 $ O(jQ′j) $,这样可以回答所有询问,时间复杂度 $ O(p log(R_0 − L_0)) $ 。如果 $ r − l $ 不是很大,那么也可以用 $ O((| Q |) + O(r − l) )$ 的时间将序列分成两部分,总复杂度为 $ O( (p + R_0 − L_0) log(R_0 − L_0) ) $。

转载于:https://www.cnblogs.com/Repulser/p/9740940.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值