题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4006
题目大意:n次操作,每次操作可以插入一个数,或者询问第k大的数。回答每个询问。 (1=<k<=n<=1000000)
思路:因为要求第k大的数,所以小于第k个数不插入。由于k和n的数据量挺大的,所以用优先队列来存储前k个数,维护小根堆顶为第k大的数。每次插入需要O(logk)的复杂度,查询只需要O(1)的复杂度。
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k;
while(~scanf("%d%d",&n,&k))
{
priority_queue<int,vector<int>,greater<int> > q;
int nk=0,num=0;
for(int i=0;i<n;i++)
{
char s[2];
scanf("%s",s);
if(s[0]=='I')
{
int t;
scanf("%d",&t);
if(t>nk)
{
q.push(t);
if(++num>k)
{
q.pop();
nk=q.top();
num=k;
}
}
}
else
cout<<q.top()<<endl;
}
}
}