NKOI 3645 黑盒序列

黑盒序列

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());
    }
}

你可能感兴趣的:(NKOI 3645 黑盒序列)