黑匣子

(box.pas/c/cpp)

【 问题描述】

某研究小组成员想发明一个黑匣子( 当然不是飞机上那个), 而是一个具有特殊功能的箱子。 这个箱子具有两个功能: 1. 存放一些正整数 x; 2. 对于第 k 次询问, 它会告诉你箱子中第 k 小的数字是多少。 但光具有理论是不够的, 理论往往应联系实际。 这可是一个大大的难题, 没有丰富程序设计知识的同学们希望你能帮助他们写出这个程序代码, 以便他们能完成黑匣子的制作。

【 输入格式】

第一行, 一个数字 n 表示对黑匣子的操作次数。

以下 n 行, 每行一个数字。 若这个数字是正整数, 则表示在黑匣子中添加这个数字;

若这个数字是­1, 这表示一次询问。

【 输出格式】

若干行, 对应每次询问所得的结果( 必定存在答案)

【 样例输入】

8

1 ­

-1

8

8 ­

-1

5 ­

-1

-1

【 样例输出】

1

8

8

8

【 样例说明】

第一次询问时, 黑匣子内为 1, 输出最小的数 1;

第二次询问时, 黑匣子内为 1 8 8, 输出第二小的数 8;

第三次询问时, 黑匣子内为 1 5 8 8, 输出第三小的数 8;

第四次询问时, 黑匣子内为 1 5 8 8, 输出第四小的数 8。

【 数据范围】

对于30%的数据, 5<=n<=200

对于60%的数据, 5<=n<=10000

对于100%的数据, 5<=n<=100000, n为整数, x为不超过maxlongint的正整数。

这是一道典型的二叉搜索树(平衡树)的题目,但是我们也能用二叉堆的方法来过这道题。//膜拜Y’ADs

首先我们新建两个堆,一个是大根堆,一个是小根堆。

大根堆用于存储前K小个数,小根堆则用于存储其他数.

那么怎样来操作呢?

每读入一个数,与大根堆的TOP(堆头)比较,如果比它小,那么把大根堆的TOP放入小根堆,再将读入的数放入大根堆,即交换。

输出只需要输出小根堆TOP就好了。

再将输出的数从小根堆放入大根堆。

那么我来解释一下为什么可以这样操作。

首先我们已知的两个堆中,大根堆的所有数一定小于小根堆的所有数。大根堆中的数正是前K个数。

接着读入的数如果大于大根堆的TOP,那么这个数就比第K小的数大,只需要放入小根堆就成了(在读入-1时输出)。

但如果它小于大根堆的TOP,证明它小于第K小数。所以把大根堆的数取出来,将读入的数放进去。再将取出的数放入小根堆(在读入-1时输出)。

code

priority_queue <int,vector<int>,greater<int> > x1;
priority_queue <int>x2; for(i=;i<=n;i++)
{
int x=read(),y;
if(x==-)
{
y=x1.top();
printf("%d\n",y);
x2.push(y);
x1.pop();
}
else
{
if(!x2.empty())
{
y=x2.top();
if(x<y){x2.pop();x2.push(x);x1.push(y);}
else x1.push(x);
}
else x1.push(x);
}
}

O(NlogN)

黑匣子_KEY的更多相关文章

  1. Luogu1801_黑匣子_KEY

    题目传送门 借这道题练一下Treap和Splay的板子. code: #include <cstdio> #include <cstdlib> using namespace ...

  2. 塔吊力矩限制器,塔吊黑匣子,塔吊电脑,tower crane

    塔机力矩限制器,tower crane 适用于各种类型的固定臂塔机和可变臂塔机 塔机力矩限制器是塔式起重机机械的安全保护装置,本产品采用32位高性能微处理器为硬件平台,软件算法采用国内最先进的三滑轮取 ...

  3. 代码详解:TensorFlow Core带你探索深度神经网络“黑匣子”

    来源商业新知网,原标题:代码详解:TensorFlow Core带你探索深度神经网络“黑匣子” 想学TensorFlow?先从低阶API开始吧~某种程度而言,它能够帮助我们更好地理解Tensorflo ...

  4. 【洛谷】【堆】P1801 黑匣子_NOI导刊2010提高(06)

    [题目描述:] Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两 ...

  5. P1801 黑匣子_NOI导刊2010提高(06)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

  6. Luogu P1801 黑匣子_NOI导刊2010提高(06)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

  7. 【洛谷P1801】黑匣子

    黑匣子 题目链接 看到题解中“维护两个堆”,突然想到了这道题的解法 维护两个堆:大根堆h1, 小根堆h2 大根堆里的是最小的i个值,小根堆里是剩下的值 每Add一个值时 插入到小根堆中, 再比较小根堆 ...

  8. 洛谷 - P1801 - 黑匣子 - 对顶堆

    这道题是提高+省选-的难度,做出来的话对数据结构题目的理解会增加很多. 可以使用一种叫做对顶堆的东西,对顶堆是在线维护第n小的logn的算法.大概的思路是,假如我们要找的是第n小,我们就维护一个大小为 ...

  9. 洛谷 P1801 黑匣子_NOI导刊2010提高(06)(未完)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

随机推荐

  1. 利用Kali进行WiFi钓鱼测试实战

    文中提及的部分技术可能带有一定攻击性,仅供安全学习和教学用途,禁止非法使用.请不要做一只咖啡馆里安静的猥琐大叔. 写在前面 从至少一年前我就一直想在自己跑kali的笔记本上架个钓鱼热点.然而由于网上的 ...

  2. [零基础学JAVA]Java SE基础部分-03. 运算符和表达式

    转自:http://redking.blog.51cto.com/27212/116751 1.课程名称:运算符.表达式 讲解了JAVA中各种运算符的使用,包括与.或.非.大于.小于等. 2.知识点 ...

  3. Python切片(入门7)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6407977.html 本文出自:[Edwin博客园] Python切片 1. 对list进行切片 L = r ...

  4. Python Django 分页

    Python Django 分页 http://www.360doc.com/content/14/0721/17/16044571_396090985.shtml

  5. Yii自定义验证规则

    简单的方法:在 model 内部定义规则 最简单的定义验证规则的方法是在使用它的模型(model)内部定义. 比方说,你要检查用户的密码是否足够安全. 通常情况下你会使用 CRegularExpres ...

  6. 牛客网多校训练第一场 F - Sum of Maximum(容斥原理 + 拉格朗日插值法)

    链接: https://www.nowcoder.com/acm/contest/139/F 题意: 分析: 转载自:http://tokitsukaze.live/2018/07/19/2018ni ...

  7. [USACO11DEC]Umbrellas for Cows

    嘟嘟嘟 我dp真是太弱了,这么简单dp都不会. 令dp[i]表示前 i 头牛头被遮住了的最低成本.则dp[i] = min{dp[i], dp[j - 1] + c[a[i] - a[j] + 1]} ...

  8. PHP------练习------投票

    练习------投票 一 .题目要求: 二 .做法 [1]建立数据库 表名:diaoyantimu 表名: diaoyanxuanxiang [2]封装类文件 <?php class DBDA ...

  9. mongodb副本集优先级设置

    在设置mongodb副本集时,Primary节点.second节点,仲裁节点,有可能资源配置(CPU或者内存)不均衡,所以要求某些节点不能成为Primary我们知道mongodb的设置:  除了仲裁节 ...

  10. mysql.sock问题

    Can't connect to local MySQL server through socket '/tmp/mysql.sock' 上述提示可能在启动mysql时遇到,即在/tmp/mysql. ...