第一次接触优先队列,算是入门题吧,发个题解纪念一下~
题意是一个元素数动态增加的数列,遇到查询时就输出数列中第k大的数。由于是动态增查,所以类似快排划分树都不敢用了,然后听说优先队列适合解,因为询问的k是不变的,所以队列中只需保留k个元素,查询时直接输出队头元素即可~
STL很好很强大啊,要学的还有很多,干巴爹……
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <stack>
#include <queue>
#include <set>
#include <iostream>
#include <algorithm>
using namespace std;
struct s{
int val;
friend bool operator < (const s a,const s b){ //从大到小排序
if(a.val > b.val) return 1;
return 0;
}
};
int main()
{
int n, k, x;
char c;
while(scanf("%d %d",&n,&k)!=EOF){
priority_queue<s> q; //优先队列
s tmp;
while(n--){
scanf(" %c",&c);
if(c=='I'){
scanf("%d",&x);
tmp.val = x;
q.push(tmp);
if(q.size()>k) q.pop();
}
else printf("%d\n",q.top());
}
}
return 0;
}