非标准库里面的平衡树
平衡树简洁版
1、用法:
- \(insert(x)\):向树中插入一个元素 \(x\),返回 \(std::pair<point\_iterator, bool>\)。
- \(erase(x)\):从树中删除一个元素 \(/\) 迭代器 \(x\),返回一个 \(bool\) 表明是否删除成功。
- \(order\_of\_key(x)\):返回 \(x\) 以 \(Cmp\_Fn\) 比较的排名。
- \(find\_by\_order(x)\):返回 \(Cmp\_Fn\) 比较的排名所对应元素的迭代器。
- \(lower\_bound(x)\):以 \(Cmp\_Fn\) 比较做 \(lower\_bound\),返回迭代器。
- \(upper\_bound(x)\):以 \(Cmp\_Fn\) 比较做 \(upper\_bound\),返回迭代器。
- \(join(x)\):将 \(x\) 树并入当前树,前提是两棵树的类型一样,\(x\) 树被删除。
- \(split(x,b)\):以 \(Cmp\_Fn\) 比较,小于等于 \(x\) 的属于当前树,其余的属于 \(b\) 树。
- \(empty()\):返回是否为空。
- \(size()\):返回大小。
#include <bits/extc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
#include <bits/stdc++.h>
using namespace __gnu_pbds;
using namespace std;
using i64 = long long;
// 此树为红黑树, 在非标准库里面, 此树可以代替平衡树, 方便不用写较长的代码, 但是有些编译器不能用, 许慎用
typedef tree<i64, null_type, less_equal<i64>, rb_tree_tag, tree_order_statistics_node_update> rbtree;
rbtree rbt;
void solve() {
int n, k;
cin >> n >> k;
vector<i64> a(n);
rbt.insert(0);
i64 sum = 0;
for (int i = 0; i < n; i++) cin >> a[i];
for (int i = 0; i < n; i++) {
sum += rbt.order_of_key(a[i] - k);
rbt.insert(a[i]);
}
cout << sum << '\n';
}
int main() {
solve();
return 0;
}

浙公网安备 33010602011771号