Description

Our Black Box represents a primitive database. It can save an integer array and has a special i variable. At the initial moment Black Box is empty and i equals 0. This Black Box processes a sequence of commands (transactions). There are two types of transactions:

ADD (x): put element x into Black Box; 
GET: increase i by 1 and give an i-minimum out of all integers containing in the Black Box. Keep in mind that i-minimum is a number located at i-th place after Black Box elements sorting by non- descending.

Let us examine a possible sequence of 11 transactions:

Example 1

N Transaction i Black Box contents after transaction Answer 
(elements are arranged by non-descending)

1 ADD(3) 0 3
2 GET 1 3 3
3 ADD(1) 1 1, 3
4 GET 2 1, 3 3
5 ADD(-4) 2 -4, 1, 3
6 ADD(2) 2 -4, 1, 2, 3
7 ADD(8) 2 -4, 1, 2, 3, 8
8 ADD(-1000) 2 -1000, -4, 1, 2, 3, 8
9 GET 3 -1000, -4, 1, 2, 3, 8 1
10 GET 4 -1000, -4, 1, 2, 3, 8 2
11 ADD(2) 4 -1000, -4, 1, 2, 2, 3, 8

It is required to work out an efficient algorithm which treats a given sequence of transactions. The maximum number of ADD and GET transactions: 30000 of each type.

Let us describe the sequence of transactions by two integer arrays:

1. A(1), A(2), ..., A(M): a sequence of elements which are being included into Black Box. A values are integers not exceeding 2 000 000 000 by their absolute value, M <= 30000. For the Example we have A=(3, 1, -4, 2, 8, -1000, 2).

2. u(1), u(2), ..., u(N): a sequence setting a number of elements which are being included into Black Box at the moment of first, second, ... and N-transaction GET. For the Example we have u=(1, 2, 6, 6).

The Black Box algorithm supposes that natural number sequence u(1), u(2), ..., u(N) is sorted in non-descending order, N <= M and for each p (1 <= p <= N) an inequality p <= u(p) <= M is valid. It follows from the fact that for the p-element of our u sequence we perform a GET transaction giving p-minimum number from our A(1), A(2), ..., A(u(p)) sequence.

Input

Input contains (in given order): M, N, A(1), A(2), ..., A(M), u(1), u(2), ..., u(N). All numbers are divided by spaces and (or) carriage return characters.

Output

Write to the output Black Box answers sequence for a given sequence of transactions, one number each line.

Sample Input

7 4
3 1 -4 2 8 -1000 2
1 2 6 6

Sample Output

3
3
1
2 解题思路分析:
拿到这道题最先想到的思路是(错误):
  1.用队列保存add命令,用vector保存进入黑箱的元素。
  2.每次向黑箱加入元素后,对黑箱中元素排序,输出第i个元素。
这个算法看似没用问题,但实际上,经过极端数据测试,在M、N均为30000时,跑完程序需要2.7s,会超时,原因是每一次添加完元素后都要对所有元素排序,时间开销太大了。然而经过分析容易发现,实际上并没有必要每次都对所有元素排序,我们只需要保存前i-1小的元素,然后找出第i个元素起之后的最小元素与前i-1个元素中最大的元素比较,即可得到第i小的元素。这样思路就明了了,
下面给出正确思路:
  1.用优先队列分别建立最小堆(顶部最小)和最大堆(顶部最大);
  2.每次i增加时,将最小堆顶部元素加入最大堆;
  3.每次加入元素时比较最小堆顶部元素和最大堆顶部元素,如果“top小”>“top大”,则交换两个堆顶部元素;
  4.输出最小堆顶部元素。
注意优先队列的两种用法:

 1. 标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。

priority_queue<int> q;

 通过<操作符可知在整数中元素大的优先级高。
  2. 数据越小,优先级越高  greater<int> 定义在头文件 <functional>中

priority_queue<int, vector<int>, greater<int> >q; 
3.自定义比较运算符<

代码如下:
 1 #include <iostream>
2 #include <set>
3 #include <vector>
4 #include <cstdio>
5 #include <queue>
6 #include <algorithm>
7 #include <time.h>
8 #include <functional>
9 using namespace std;
10 #define clock__ (double(clock())/CLOCKS_PER_SEC)
11
12 int M,N;
13 queue<int> A;//存储add命令
14 priority_queue<int,vector<int>,greater<int> > A_min;//最小堆
15 priority_queue<int> A_max;//最大堆
16 int i;
17
18 int main() {
19
20 i=0;
21 scanf("%d%d",&M,&N);
22 while (M--) {
23 int a;
24 scanf("%d",&a);
25 A.push(a);
26 }
27 while(N--){
28 int u;
29 scanf("%d",&u);
30 i++;
31 if(A_min.size()!=0) {
32 A_max.push(A_min.top());
33 A_min.pop();
34 }
35 int n=u-(A_min.size()+A_max.size());
36 while(n--){
37 A_min.push(A.front());A.pop();
38 if(A_max.size()&&A_min.size()&&A_min.top()<A_max.top()){
39 int a=A_max.top(); A_max.pop();
40 int b=A_min.top(); A_min.pop();
41 A_min.push(a);A_max.push(b);
42 }
43 }
44 printf("%d\n",A_min.top());
45
46 }
47 // cout<<"time : "<<clock__<<endl;
48 return 0;
49 }

最新文章

  1. WaitType:ASYNC_IO_COMPLETION
  2. VFP 祺佑三层开发框架快速开发 演示DEMO
  3. Python生成二维码脚本
  4. 谈谈自己了解的spring.NET的依赖注入
  5. javaweb数据库操作
  6. 论文笔记之:Asynchronous Methods for Deep Reinforcement Learning
  7. npm ERR!无法安装任何包的解决办法
  8. 使用SCNetworkReachability判断网络是否连接
  9. 软件介绍(apache lighttpd nginx)
  10. java web实现img读取盘符下的图像
  11. js得到分页栏
  12. cocos2dx 制作单机麻将(二)
  13. Node.js 网络
  14. 进阶-MongoDB 知识梳理
  15. 10. 搭配redis做文章缓存
  16. Windows迁移打印机与打印队列
  17. js初学
  18. 如何优雅的关闭Golang Channel?
  19. 大面积project.pbxproj冲突问题解决
  20. php 将时间格式 转为时间戳

热门文章

  1. kubernetes对象之Job
  2. kubernetes之初始容器(init container)
  3. 将Ubuntu主文件夹里的中文文件夹名称改成英文
  4. mac 权限问题
  5. 2018.11.23-day25 面向对象-封装
  6. GitLab Pages expect to run on their own virtual host
  7. Requires: libstdc++.so.6(GLIBCXX_3.4.15)(64bit)
  8. Linux环境下安装MySQL(解压方式)
  9. 录音-树莓派USB摄像头话筒
  10. view 视图生命周期