結果
| 問題 |
No.649 ここでちょっとQK!
|
| コンテスト | |
| ユーザー |
toyama
|
| 提出日時 | 2019-12-16 22:29:23 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 291 ms / 3,000 ms |
| コード長 | 2,008 bytes |
| コンパイル時間 | 981 ms |
| コンパイル使用メモリ | 92,548 KB |
| 実行使用メモリ | 6,948 KB |
| 最終ジャッジ日時 | 2024-07-02 20:36:04 |
| 合計ジャッジ時間 | 6,130 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 32 |
ソースコード
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <functional>
#include <algorithm>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <cassert>
using namespace std;
using llong = long long;
//===
//#include <cassert>
template<typename T, typename Compare = function<bool(T, T)> >
struct FindKth {
using Heap = priority_queue<T, vector<T>, Compare>;
const int K;
Heap maxh;
Heap minh;
FindKth (const int K, const Compare &cmp = less<T>()):
K(K),
maxh(cmp),
minh([&cmp](auto l, auto r){ return cmp(r, l); })
{};
size_t size() {
return maxh.size() + minh.size();
};
bool empty() {
return size() > 0 ? false : true;
};
void push(T &d){
maxh.push(d);
if (maxh.size() > K) {
minh.push(maxh.top());
maxh.pop();
}
};
T find(){
assert(maxh.size() == K);
return maxh.top();
};
T find_lower(){
assert(!empty());
return maxh.top();
};
void pop() {
assert(!empty());
maxh.pop();
if (!minh.empty()) {
maxh.push(minh.top());
minh.pop();
}
};
void merge_with(FindKth &r) {
FindKth &l = *this;
if (l.size() < r.size()) swap(l, r);
while (!r.empty()){
l.push(r.find_lower());
r.pop();
}
};
};
//===
int yc649() {
llong q, k;
llong com, v;
cin >> q >> k;
FindKth<llong> st(k);
while (q--) {
cin >> com;
if (com == 1) {
cin >> v;
st.push(v);
}
else {
if (st.size() < k) {
cout << -1 << endl;
}
else {
cout << st.find() << endl;
st.pop();
}
}
}
return 0;
}
int main() {
return yc649();
}
toyama