题目链接:
题意:
已知k,一开始序列为空,有n个操作,要么向序列里插入一个值,要么询问序列中第k大的数是多少。
思路:
用最小堆或者优先队列维护最小值。当插入的数大于k个时,弹出最小值。因此,最小堆或优先队列中每次都只有k个数,在询问的时候输出当前最小堆或优先队列中的最小值即可。
Code:(最小堆stl实现)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX = 500000 + 100;
int n, k;
vector<int>a;
bool cmp(int x, int y) {
return x > y;
}
int main()
{
while (scanf("%d%d", &n, &k) != EOF)
{
a.clear();
make_heap(a.begin(), a.end(), cmp);
while (n--) {
char op[5];
scanf("%s", op);
if (op[0] == 'I') {
int x;
scanf("%d", &x);
a.push_back(x);
push_heap(a.begin(), a.end(), cmp);
if (a.size() > k) {
pop_heap(a.begin(), a.end(), cmp);
a.pop_back();
}
}
else {
printf("%d\n", a[0]);
}
}
}
return 0;
}