題目大意

寫一個資料結構, 支援插入資料以及求第 k 大。

題解

看其他人提解,這一題可以暴力 O(n2) 水過去,不過複雜度看起來不正確就是了。

如果不想寫平衡樹,可以直接用黑魔法平衡樹 (pbds tree),有內建 find_by_order 求第 k 大,可以穩定 O(nlogn) 解出來。

AC Code

ふうちゃんがかわいい。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
using pii = pair<int, int>;
tree<pii, null_type, greater<pii>, rb_tree_tag, tree_order_statistics_node_update> hitode;

int main() {
ios::sync_with_stdio(false);
cin.tie(0);

string cmd;
int val, t = 0;
while (cin >> cmd) {
if (cmd[0] == 'E')
break;
cin >> val;

if (cmd[0] == 'G') {
hitode.insert(make_pair(val, t++));
} else {
auto ptr = hitode.find_by_order(val - 1);
cout << ptr->first << '\n';
}
}
}

OJ 連結

連結:https://zerojudge.tw/ShowProblem?problemid=d314