眼镜好烦人
题意:
一个整数的可重集合,两种操作:I x,向集合中插入x;Q,询问集合中第k大的数是多少
Input
There are several test cases. For each test case, the first line of input contains two positive integer n, k. Then n lines follow. If Xiao Ming choose to write down a number, there will be an " I" followed by a number that Xiao Ming will write down. If Xiao Ming choose to ask Xiao Bao, there will be a "Q", then you need to output the kth great number.
Output
The output consists of one integer representing the largest number of islands that all lie on one line.
第k大直接就想到了区间第k大想用线段树做。。。。看来刷题刷的太死了,多打打比赛
队友马上就想到了机智的正确做法:一个优先队列维护最大的k个数,就是小的数放在队首,保持堆中只有k个数,这样堆顶的数就是第k大的数。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
struct hehe{
int a;
bool operator < (const hehe& in)const{
return a>in.a;
}
};
priority_queue<hehe> heap;
int n,k;
int main(){
while(scanf("%d%d",&n,&k)!=EOF){
while(!heap.empty()) heap.pop();
char d;
int read;
int cnt=0;
hehe tem;
for(int i=0;i<n;++i){
getchar();
d=getchar();
if(d=='I'){
scanf("%d",&read);
tem.a=read;
heap.push(tem);
if(cnt>=k) heap.pop();
if(cnt<k) ++cnt;
}
else printf("%d\n",heap.top().a);
}
}
return 0;
}