• 整体二分笔记


    整体二分

    本文以下的代码见这里

    二分,精髓就在于一个"猜测"。猜测答案是否小于 m i d mid mid 、是否等于 m i d mid mid

    先想一个简单的问题:一次查询全序列中排名为 k k k 的数。

    排名的定义是:小于一个数的数的个数。

    当然可以排序然后输出。也可以用二分解决:

    猜测排名为 k k k 的数是 m i d mid mid ,然后比较 k k k m i d mid mid 的排名(记为 m i d . r k mid.rk mid.rk )。

    如果 m i d . r k < k mid.rkmid.rk<k ,那说明 m i d mid mid 偏小,排名为 k k k 的数的值就位于 [ m i d + 1 , r ] [mid+1,r] [mid+1,r] 。反之不赘述。

    根据排名的定义,一个数的排名可以用桶标记全序列然后做前缀和求。

    时间复杂度是 O ( n + lg ⁡ n ) O(n+\lg_n) O(n+lgn)

    这是一个思维体操。

    当询问很多,一次次处理的效率就变得低效。

    那么不妨想一想:能否把全部询问放在一起?递归去实现?

    此时二分的 [ L , R ] [L,R] [L,R] 是答案的值域,当做传参放进递归。

    对于每个 [ L , R ] [L,R] [L,R] ,都存在一些(可能为0)个询问的答案值位于此区间内。

    L = R L=R L=R 的时候就意味着确定了答案,当前区间"拥有"的询问的答案都等于 L L L

    所以在每次递归时要做的事情是将全部询问划分为两类:答案不大于 m i d mid mid 的、答案大于 m i d mid mid 的。

    然后递归下去。

    问题就在于如何划分

    两个问题阐明:

    1、多次查询全序列中排名第 k k k 的值。

    直接比较 m i d mid mid 在全序列中的排名和要查询的排名,然后根据比较结果划分。

    递归下去。

    求全序列中的排名可以在输入完后直接用桶来给每个数打标记,然后做前缀和。

    这个操作可以用树状数组优化。

    2、多次查询区间排名第 k k k 的值。

    还是考虑比较 m i d mid mid 在查询区间内的排名和要查询的排名。

    能否继续这样操作?很明显不能,为什么?

    因为存在值域不在 [ L , R ] [L,R] [L,R] 内的数!这样求出的排名是错误的。

    那可不可以在当前递归找到值域位于 [ L , R ] [L,R] [L,R] 的数再在递归内计算排名?

    **可以。**划分询问都可以完成,把数划分的操作为什么不可以?

    所以对于每个 [ L , R ] [L,R] [L,R] ,不仅存在一些询问的答案值位于此区间内,还存在一些原序列的数的值域位于此区间内。

    那么问题就在于查询 m i d mid mid 在询问区间内的排名。

    可以把值域 [ L , R ] [L,R] [L,R] "拥有"的、小于 m i d mid mid 的数按照原序列中的位置加入树状数组。

    然后树状数组中就都是小于 m i d mid mid 的数了,在这之中直接查区间 [ q i . l , q i . r ] [q_i.l,q_i.r] [qi.l,qi.r] 有多少个数就是 m i d mid mid [ l , r ] [l,r] [l,r] 内的排名。

    至此,问题解决。

    这样在递归内每次都搞一遍,时间效率怎么样?

    记答案值域大小为 N N N

    不难发现最多递归 lg ⁡ N \lg_N lgN 层,每层的时间复杂度是 N lg ⁡ N N\lg_N NlgN 级别的,故时间复杂度是 O ( N lg ⁡ N 2 ) O(N\lg_N^2) O(NlgN2)

    那么可以有一个基本的套路:想方设法求出 m i d mid mid 的数据,将 m i d mid mid 的数据与查询数据比较以划分区间。

    OI题瞬息万变,最重要的还是见招拆招,灵活处理。

  • 相关阅读:
    【小尘送书-第五期】《巧用ChatGPT快速提高职场晋升力》用ChatGPT快速提升职场能力,全面促进自身职业发展
    抖音订单列表查询api接口
    Activity(页面)的生命周期
    牛客网—链表的回文结构
    为季前卡牌游戏 MotoGP™ Ignition Champions 做好准备!
    Java 给Word每一页设置不同文字水印效果
    高项 02 信息系统项目管理基础
    中秋节快乐--祝诸佬们今后月来月靓
    K8S架构常用组件核心资源
    detectron2环境搭建及自定义coco数据集(voc转coco)训练
  • 原文地址:https://blog.csdn.net/Tudou_Pika/article/details/126293504