题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4006
题目大意:有n次操作,"I x"代表插入x,"Q"表示询问序列中第k大的数(k是已知的)。
分析:优先队列即可。我们把数字小的设为高优先级,然后依次插入每个数即可,维护一个长度为k的队列。如果队列中元素个数大于k个,则将队头的元素出列,这样,队头的元素始终是第k大的,询问时直接输出队头元素即可。优先队列的插入和删除复杂度都是logn。
实现代码如下:
#include <cstdio>
#include <iostream>
#include <queue>
using namespace std;
struct cmp
{
bool operator()(int x,int y)
{
return x>y;
}
};
int main()
{
int n,k,x;
char ch[5];
while(scanf("%d%d",&n,&k)!=-1)
{
priority_queue <int,vector<int>,cmp> que;
for(int i=0;i<n;i++)
{
scanf("%s",ch);
if(ch[0]=='I')
{
scanf("%d",&x);
que.push(x);
if(que.size()>k)
que.pop();
}
else printf("%d\n",que.top());
}
}
return 0;
}