結果
問題 | No.649 ここでちょっとQK! |
ユーザー | kazuma |
提出日時 | 2018-04-03 21:57:00 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
RE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 3,038 bytes |
コンパイル時間 | 2,176 ms |
コンパイル使用メモリ | 205,948 KB |
実行使用メモリ | 13,056 KB |
最終ジャッジ日時 | 2024-06-26 08:34:31 |
合計ジャッジ時間 | 7,778 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | RE | - |
testcase_01 | AC | 2 ms
5,376 KB |
testcase_02 | RE | - |
testcase_03 | AC | 31 ms
5,376 KB |
testcase_04 | AC | 93 ms
13,056 KB |
testcase_05 | AC | 108 ms
13,056 KB |
testcase_06 | AC | 96 ms
13,056 KB |
testcase_07 | RE | - |
testcase_08 | AC | 1 ms
5,376 KB |
testcase_09 | AC | 2 ms
5,376 KB |
testcase_10 | AC | 2 ms
5,376 KB |
testcase_11 | AC | 2 ms
5,376 KB |
testcase_12 | RE | - |
testcase_13 | RE | - |
testcase_14 | RE | - |
testcase_15 | RE | - |
testcase_16 | RE | - |
testcase_17 | RE | - |
testcase_18 | RE | - |
testcase_19 | RE | - |
testcase_20 | RE | - |
testcase_21 | RE | - |
testcase_22 | RE | - |
testcase_23 | RE | - |
testcase_24 | RE | - |
testcase_25 | RE | - |
testcase_26 | RE | - |
testcase_27 | AC | 3 ms
5,376 KB |
testcase_28 | AC | 3 ms
5,376 KB |
testcase_29 | RE | - |
testcase_30 | RE | - |
testcase_31 | RE | - |
testcase_32 | RE | - |
testcase_33 | AC | 2 ms
5,376 KB |
testcase_34 | RE | - |
testcase_35 | AC | 2 ms
5,376 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; template <typename T> class avl_tree { struct node { T val; node *ch[2]; int dep, size; node(T v, node* l = nullptr, node* r = nullptr) : val(v), dep(1), size(1) { ch[0] = l; ch[1] = r; } }; int depth(node *t) { return t == nullptr ? 0 : t->dep; } int count(node *t) { return t == nullptr ? 0 : t->size; } node *update(node *t) { t->dep = max(depth(t->ch[0]), depth(t->ch[1])) + 1; t->size = count(t->ch[0]) + count(t->ch[1]) + 1; return t; } node *rotate(node *t, int b) { node *s = t->ch[1 - b]; t->ch[1 - b] = s->ch[b]; s->ch[b] = t; t = update(t); s = update(s); return s; } node *fetch(node *t) { if (t == nullptr) return t; if (depth(t->ch[0]) - depth(t->ch[1]) == 2) { if (depth(t->ch[0]->ch[1]) > depth(t->ch[0]->ch[0])) { t->ch[0] = rotate(t->ch[0], 0); } t = rotate(t, 1); } else if (depth(t->ch[0]) - depth(t->ch[1]) == -2) { if (depth(t->ch[1]->ch[0]) > depth(t->ch[1]->ch[1])) { t->ch[1] = rotate(t->ch[1], 1); } t = rotate(t, 0); } return t; } node *insert(node *t, int k, T v) { if (t == nullptr) return new node(v); int c = count(t->ch[0]), b = (k > c); t->ch[b] = insert(t->ch[b], k - (b ? (c + 1) : 0), v); update(t); return fetch(t); } node *erase(node *t) { if (t == nullptr) return nullptr; if (t->ch[0] == nullptr && t->ch[1] == nullptr) { delete t; return nullptr; } if (t->ch[0] == nullptr || t->ch[1] == nullptr) { node *res = t->ch[t->ch[0] == nullptr]; delete t; return res; } node *res = new node(find(t->ch[1], 0)->val, t->ch[0], erase(t->ch[1], 0)); delete t; return fetch(update(res)); } node *erase(node *t, int k) { if (t == nullptr) return nullptr; int c = count(t->ch[0]); if (k < c) { t->ch[0] = erase(t->ch[0], k); t = update(t); } else if (k > c) { t->ch[1] = erase(t->ch[1], k - (c + 1)); t = update(t); } else { t = erase(t); } return fetch(t); } node *find(node *t, int k) { if (t == nullptr) return t; int c = count(t->ch[0]); return k < c ? find(t->ch[0], k) : k == c ? t : find(t->ch[1], k - (c + 1)); } int cnt(node *t, T v) { if (t == nullptr) return 0; if (t->val < v) return count(t->ch[0]) + 1 + cnt(t->ch[1], v); if (t->val == v) return count(t->ch[0]); return cnt(t->ch[0], v); } node *root; public: avl_tree() : root(nullptr) {} int size() { return count(root); } void insert(T val) { root = insert(root, cnt(root, val), val); } void erase(int k) { root = erase(root, k); } T select(int k) { return find(root, k)->val; } int count(T val) { return cnt(root, val); } }; int main() { ios::sync_with_stdio(false), cin.tie(0); int Q, K; cin >> Q >> K; avl_tree<ll> tree; while (Q--) { int t; cin >> t; if (t == 1) { ll v; cin >> v; tree.insert(v); } else if (tree.size() >= K) { printf("%lld\n", tree.select(K - 1)); tree.erase(K - 1); } else { printf("%d\n", -1); } } return 0; }