这个题居然过的人这么多。。。我居然不会最小堆。。。。。用STL 的优先队列各种超时。。。。好吧。。。。
晚间对于这场比赛进行了讨论。。。也终于学会了这种手写的堆。。。。
(原来STL也是可以的。。。。刚刚试过。。。。。T T )
手写堆代码
#include<iostream>
#include<cstring>
using namespace std;
const int maxlen = 1000010;
int a[maxlen], size;
inline void init1() {
size = 0;
}
void insert1(int x) {
int p = ++size, c = size >> 1;
while (p > 1 && a[c] > x) {
a[p] = a[c], p = c, c >>= 1;
}
a[p] = x;
}
void pop1() {
int p = 1, c = 2, x = a[size];
size--;
while (c <= size) {
if (c + 1 <= size && a[c + 1] < a[c])
c++;
if (c <= size && a[c] < x) {
a[p] = a[c], p = c, c <<= 1;
} else break;
}
a[p] = x;
}
int main() {
int n, k, x, y;
char s[2];
while (scanf("%d%d", &n, &k) != -1) {
init1();
for (int i = 1; i <= n; i++) {
scanf("%s", s);
if (s[0] == 'Q') {
printf("%d\n", a[1]);
} else {
scanf("%d", &x);
if (i <= k)
insert1(x);
else if (x > a[1]) {
pop1();
insert1(x);
}
}
}
}
return 0;
}
STL代码
#include<iostream>
#include<queue>
using namespace std;
priority_queue<int, vector<int>, greater<int> > q;
int main() {
int n, k, x, i;
char s[2];
while (scanf("%d%d", &n, &k) != -1) {
while(!q.empty())
q.pop();
for (i = 1; i <= n; i++) {
scanf("%s", s);
if (s[0] == 'Q') {
printf("%d\n", q.top());
} else {
scanf("%d", &x);
if (i <= k)
q.push(x);
else if (x > q.top()) {
q.pop();
q.push(x);
}
}
}
}
return 0;
}