洛谷

摘要:
您可以使用称为top heap的东西,这是一种在线维护第n个最小logn的算法。但似乎其他平衡树也能解决这个问题。例如,一场排名很快的比赛?既然这出戏这么复杂,你为什么不用主席树呢?事实上,我们仍然需要旋转来保持平衡树的特性……第k个最小值的动态维护也可以通过各种平衡树来完成。顶部堆保持顶部堆只会持续扩展的状态非常方便。这里我们根据标题将其命名为“黑盒堆栈”:请注意,每次顶部堆栈扩展时,如果底部堆栈中有元素,它们将首先从底部堆栈中获得。

这道题是提高+省选-的难度,做出来的话对数据结构题目的理解会增加很多。

可以使用一种叫做对顶堆的东西,对顶堆是在线维护第n小的logn的算法。大概的思路是,假如我们要找的是第n小,我们就维护一个大小为n的(位于下方的)大顶堆,(位于上方的)小顶堆中每个元素都比大顶堆的大。在这道题中,n不变时每次有新的比他小的就把堆顶弹出到对顶(也就是小顶堆)的堆顶,每次n扩大的时候就从(上面的)小顶堆里取出堆顶放进大顶堆的堆顶……

但是看样子应该其他平衡树也是可以解决这个问题的。比如支持快速名次的splay?还有完全另一个维度复杂的主席树(区间第k大)。

这道题应该是对顶堆最简单了。但是明显是用别的数据结构更好,因为对顶堆的第n小只能慢慢变……这样真的不如splay……(当然啦!splay这么复杂,你怎么不用主席树呢?主席树还区间第k大呢?)

Pdalao说了一个,可以用BST来维护,每个节点维护左子树的名次,那么找k的时候就可以判断是进入左子树还是右子树了,陷入思考……其实还是要旋转来保持平衡树的特性……

真实的递归学习法,一个两个都不会。


动态维护第k小也可以交给各类平衡树去完成。 而且k还可以不断改。

对顶堆用来维护一种顶堆只会不断扩大的情形非常方便。和之前的动态求中位数一个道理。

这里我们根据题目命名为“黑匣子堆”:注意每次顶堆扩大时,假如底堆有元素则优先从底堆获取。

#include<bits/stdc++.h>
using namespacestd;

structBlack_Box_Heap{
    //top_heap has the min element,bottom heap has the max element
priority_queue<int,vector<int>,less<int> >top_heap;
    priority_queue<int,vector<int>,greater<int> >bottom_heap;

    inti;

    Black_Box_Heap(){i=0;}

    void add(intvalue){
        if(top_heap.size()<=i){
            top_heap.push(value);
        }
        else{
            if(value<top_heap.top()){
                bottom_heap.push(top_heap.top());
                top_heap.pop();
                top_heap.push(value);
            }
            else{
                bottom_heap.push(value);
            }
        }
    }

    int get(){
        int t=top_heap.top();
        i++;
        while(top_heap.size()<=i&&!bottom_heap.empty()){
            top_heap.push(bottom_heap.top());
            bottom_heap.pop();
        }
        returnt;
    }
}bbh;

int a[200005];

intmain(){
    intm,n;
    scanf("%d%d",&m,&n);
    for(int i=1;i<=m;i++){
        scanf("%d",&a[i]);
    }

    int j=1;
    for(int i=1;i<=n;i++){
        intu;
        scanf("%d",&u);
        while(u>=j){
            bbh.add(a[j]);
            j++;
        }

        printf("%d
",bbh.get());
    }
}

免责声明:文章转载自《洛谷》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇解决VMware虚拟机网络时长中断的问题SQL Server查看库、表占用空间大小下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

ARCGIS10.5安装教程(附完整安装包和汉化包)

开始安装。可以通过路径修改的licensemanager的安装可以在十几秒内完成。开始安装桌面。在旧步骤中,首先提取它,然后安装它。第二个破解步骤是在破解文件夹中找到AfCore,如图Dll文件所示,该文件夹对应于桌面安装。例如,如果这篇文章的桌面安装路径为“D:ProgramFilesArcGISDesktop10.5”,则AfCore the dll将复...

Asp.Net开源服务端框架,WebApi后端框架(C#.NET)

本文主要介绍了基于Asp.Net平台、C#语言+SQL数据库的服务器的WebApi后端框架。K=WebApi&c=1&p=1.NETWebApi开发框架|MVC框架|后端框架|服务器框架-标准版本V1.0适用开发:快速构建支持多个客户端的服务器程序,并支持APP、B/S、c/S跨平台移动终端等。C/S系统开发框架的高级版本或更高版本支持多种后...

等保2.0四级安全要求

平等保护2.0四级安全要求四级安全保护能力:应能够在统一的安全战略下,防止恶意攻击、严重自然灾害和来自国家一级、敌对组织和资源丰富的威胁源的其他严重危害造成的资源损害。它应该能够及时检测和监控攻击和安全事件,所有功能都可以快速恢复。以下粗体字段是平等保护的第4级和第3级之间的差异,应予以更多注意。...

android获取Mac地址和IP地址

在实际项目中测试了以下方法以获取Mac地址:(1)设备打开Wifi连接并获取网卡的Mac地址(但不打开Wifi,无法获取Mac地址。此方法也是网络上最常用的方法)//本地MacpublicstaticStringgetLocalMacAddressFromWifiInfo(Contextcontext){WifiManagerwifi=(WifiManage...

Docker(一)

Docker的优势:1.更高效的利用系统资源。docker-v:查看Docker版本。dockerhistory:查看镜像内的历史记录。dockerdiff:查看修改的内容。使用Dockerfile定制镜像:1.以之前定制nginx镜像为例,这次我们使用Dockerfile来定制。操作Docker容器:启动容器有两种方式:一种:是基于镜像新建一个容器并启动,...

Windows命令行中cd失效应对方法

管理员模式打开命令行进行操作也不起效从当前目录下跳转到不同分区路径d:\的时候,cdd:\没有成功,当前目录没有发生改变。问题解决方法一添加强制跳转参数“/d”当添加了一个参数/d之后,命令成功地执行了。但是,如果进入的是当前目录的子目录,则可以不使用/d参数。方法二直接输入磁盘名称还有一种方法就是不使用cd命令直接跳转磁盘这里还要注意的一小点是Window...