题意
不断地向数组里面加数,然后有多次询问,每次询问要求输出该数组中第k大的数
数组长度和询问次数不超过1e6
思路
此题貌似有多种做法,用树状数组和线段树也能做.
用优先队列来做的话,就是维护有k个数的最小堆,每次询问是将堆顶的数输出即可
#include<iostream>
#include<algorithm>
#include<queue>
#include<functional>
using namespace std;
priority_queue<int,vector<int>,greater<int> >q;
int main(){
int n,k;
while(cin>>n>>k){
while(!q.empty())
q.pop();
int Min;
int num=0;
for(int i=0;i<n;i++){
char s;
cin>>s;
if(s=='I'){
int d;
cin>>d;
if(num<k){ //先将前k个数放入堆中,形成一个初始堆
q.push(d);
num++;
if(num==k-1)
Min=q.top();
continue;
}
else if(d<=Min){ //如果新的数比堆顶的数字要小,则不用放入堆中
continue;
}
else{ //否则放入堆中,并将之前最小的数出堆
q.push(d);
q.pop();
Min=q.top();
}
}
if(s=='Q')
cout<<q.top()<<endl;
}
}
return 0;
}