黑盒序列
Time Limit:10000MS Memory Limit:65536K
Total Submit:4 Accepted:4
Case Time Limit:1000MS
Description
有一个只能存放整数的序列叫“黑盒序列”,一开始序列为空。对于该序列,我们有ADD和GET两种操作:
ADD(x):表示往序列中添加一个值为x的整数;
GET(y):表示在第y次ADD操作后,取出序列中第k小的一个数,并将其输出。(k初值为1,每执行一次GET操作后,k的值会加1)
数列中的整数的绝对值不超过2,000,000,000
Input
第一行,两个整数N和M分别表示ADD和GET的操作次数(0<=N,M<=30000)
第二行,N个空格间隔的整数,表示每次ADD操作往数列中添加的数字
第三行,M个空格间隔的整数,其中第i个数表示在执行了i次ADD操作后,执行一次GET操作。
Output
M行,每行一个整数,表示对应GET操作输出的值
Sample Input
7 4
3 1 -4 2 8 -1000 2
1 2 6 6
Sample Output
3 3 1 2样例说明: 操作顺序 k 黑盒序列 输出结果 1 ADD(3) 3 GET 1 3 3 2 ADD(1) 1, 3 GET 2 1, 3 3 3 ADD(-4) -4, 1, 3 4 ADD(2) -4, 1, 2, 3 5 ADD(8) -4, 1, 2, 3, 8 6 ADD(-1000) -1000, -4, 1, 2, 3, 8 GET 3 -1000, -4, 1, 2, 3, 8 1 GET 4 -1000, -4, 1, 2, 3, 8 2 9 ADD(2) -1000, -4, 1, 2, 2, 3, 8
Source
neer 1996poj1442
小根堆
#include<cstdio>
#include<queue>
using namespace std;
int add[30005],get[30005];
priority_queue<int>big;//创建一个大根堆
priority_queue<int,vector<int>,greater<int> >small;//创建一个小根堆
int main(){
int i,k,n,m;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)scanf("%d",&add[i]);
for(i=1;i<=m;i++)scanf("%d",&get[i]);
for(k=1;k<=m;k++){
for(i=get[k-1]+1;i<=get[k];i++)big.push(add[i]);
while(big.size()>=k){
small.push(big.top());
big.pop();
}
big.push(small.top());
small.pop();
printf("%d\n",big.top());
}
}