这个题居然过的人这么多。。。我居然不会最小堆。。。。。用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; }