結果
| 問題 | No.649 ここでちょっとQK! |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-08-25 18:56:56 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 335 ms / 3,000 ms |
| コード長 | 1,928 bytes |
| 記録 | |
| コンパイル時間 | 2,386 ms |
| コンパイル使用メモリ | 200,208 KB |
| 最終ジャッジ日時 | 2025-01-13 14:37:05 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 32 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template <typename T>
struct LRPrique {
using F = function<int(int)>;
const F f;
const T err;
priority_queue<T> L;
priority_queue<T, vector<T>, greater<>> R;
int L_sz, R_sz;
T L_sum, R_sum;
// f(sz) -> size of L
// e.g.) median : [](int sz) -> int { return (sz + 1) / 2; }
LRPrique(F f, T err = numeric_limits<T>::max())
: f(f), err(err), L_sz(0), R_sz(0), L_sum(0), R_sum(0) {}
void L_push(T x) {
++L_sz;
L_sum += x;
L.emplace(x);
}
void R_push(T x) {
++R_sz;
R_sum += x;
R.emplace(x);
}
T L_pop() {
T ret = L.top();
L.pop();
--L_sz;
L_sum -= ret;
return ret;
}
T R_pop() {
T ret = R.top();
R.pop();
--R_sz;
R_sum -= ret;
return ret;
}
void emplace(T x) {
if (R.empty() or R.top() > x)
L_push(x);
else
R_push(x);
}
void flatten() {
int gL_sz = f(L_sz + R_sz);
while (L.size() < gL_sz) {
T tp = R_pop();
L_push(tp);
}
while (L.size() > gL_sz) {
T tp = L_pop();
R_push(tp);
}
}
T get() {
int gL_sz = f(L_sz + R_sz);
if (gL_sz > L_sz + R_sz) return err;
flatten();
return L.top();
}
};
signed main() {
int Q, K;
cin >> Q >> K;
LRPrique<ll> lr([=](int sz) -> int { return K; });
while (Q--) {
int T;
cin >> T;
if (T == 1) {
ll a;
cin >> a;
lr.emplace(a);
} else {
ll ret = lr.get();
if (ret == lr.err) {
cout << -1 << endl;
} else {
cout << ret << endl;
lr.L_pop();
}
}
}
}