【POJ 1442】 Black Box
2015-08-09 23:30
218 查看
【POJ 1442】 Black Box
向一个恒递增序列中加数 一开始序列为空 不断加m个数 有n个询问 x1x2x3…xi每次个询问表示加第x个数后 第i小的数是几
两个优先队列进行维护 一个递增一个递减 令递增队列对首为当前第i小的数 因此递减队列需要存i前的数
每当序列需要加一个数时 先与递减队列比较
如果比递减队列队首(前i-1个数中最大的数)小 将该数入递减队列 把递减队列对首拿出加入递增队列 此时递增队列队首即为当前第i小的数
如果比递减队列队首大 直接加入递增队列 递增队列对首为当前第I小的数
代码如下:
向一个恒递增序列中加数 一开始序列为空 不断加m个数 有n个询问 x1x2x3…xi每次个询问表示加第x个数后 第i小的数是几
两个优先队列进行维护 一个递增一个递减 令递增队列对首为当前第i小的数 因此递减队列需要存i前的数
每当序列需要加一个数时 先与递减队列比较
如果比递减队列队首(前i-1个数中最大的数)小 将该数入递减队列 把递减队列对首拿出加入递增队列 此时递增队列队首即为当前第i小的数
如果比递减队列队首大 直接加入递增队列 递增队列对首为当前第I小的数
代码如下:
#include <cstdio> #include <cstdlib> #include <cstring> #include <queue> #include <vector> using namespace std; int num[30001]; priority_queue <int,vector<int>,greater<int> > small; priority_queue <int,vector<int>,less<int> > big; int main() { int m,n,i,x; scanf("%d %d",&m,&n); for(i = 1; i <= m; ++i) { scanf("%d",&num[i]); } i = 1; while(n--) { scanf("%d",&x); while(i <= x) { if(big.empty() || num[i] >= big.top()) { small.push(num[i]); } else { big.push(num[i]); small.push(big.top()); big.pop(); } ++i; } x = small.top(); small.pop(); printf("%d\n",x); big.push(x); } return 0; }
相关文章推荐
- Uoj#9感想
- 来京两周年
- Java对象克隆
- listView中监听冲突问题(以及view里tag的使用)
- HDU 4804 Campus Design(经典轮廓线问题扩展)
- 类的构成
- 01_Nginx安装,nginx下部署项目,nginx.conf配置文件修改,相关文件配置
- kicistart 部署linux(实验失败,待排错)
- css浮动
- 01_Nginx安装,nginx下部署项目,nginx.conf配置文件修改,相关文件配置
- 互联网金融四大暴富机会:P2P 征信 支付 供应链金融
- java倒油分析
- Spring Bean基本管理
- 第81讲:Scala中List的构造时的类型约束逆变、协变、下界详解学习笔记
- 孤独,我的宿命
- Codeforces Round #295 (Div. 1) B. Cubes(最大最小堆+拓扑模拟)
- burp suite使用(三)--- intruder收集关键信息
- Java类对象的定义和使用
- gitweb 搭建教程
- Reverse Integer