非标准库里面的平衡树

平衡树简洁版

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;
}
posted @ 2024-09-08 00:44  grape_king  阅读(22)  评论(0)    收藏  举报