前言
- msjing准备学平衡树,开始到处炫耀她的 \(Treap\) 板子,sbmqwm告诉她可以用 \(pbds\) 来代替手写平衡树,作为蓝蛋的msjing决定学一下
参考
pb_ds简介
- 这个东东是一个非 C++14 原生的库,其中封装了:平衡树,字典树,哈希表,优先队列,且常数小,好像可以在比赛里用(具体以 \(NOI\) 的文件为准)
准备阶段
头文件的准备
- \(pbds\) 拥有与 \(std\) 一样的头文件:
#include<bits/extc++.h>,但是 \(Dev\) 用不了,不过你可以这样做:
- 在Dev里写
#include<bits/extc++.h>,报错后点图中框出的报错

- 然后挑要用的 copy,注意不要复制
#ifdef _GLIBCXX_HAVE_ICONV名录下的
- 我们要用的 \(tree\) 只需要以下两个头
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
- 然后你要写一下
using namespace __gnu_pbds;,然后就不用写冗长的一堆玩意了
声明及传参
- 接下来是传参数,一共6个:
tree<a,b,c,d,e> f;
- \(a:\) 数据类型 \(key:\) 包括
int,long long等,好像你也可以写pair和struct等
- \(b:\) 映射规则 \(mapped:\) 一般使用
null_type,g++ 太旧就用null_mapped_type
- \(c:\) 比较排列方式 \(cmp\)_\(fn:\) 从小到大是
less<>,从大到小是 greater<>
- \(d:\) 数据结构类型 \(tag:\) 有红黑树:
rb_tree_tag,vector有序向量树:ov_tree_tag,\(splay:\) splay_tree_tag,红黑树最常用
- \(e:\) 节点更新方式 \(node\)_\(update:\) 一般用
null_node_update,需 order_of_key 和 find_by_order 则用 tree_order_statistics_node_update,尽量用后面的
- \(f:\) 变量名
成员函数
insert(x):插入 \(x\)
erase(x):删除 \(x\)
order_of_key(x):返回 \(x\) 的排名
find_by_order(x):返回第 \(x\) 小的值的迭代器
lower_bound(x):返回第一个大于等于 \(x\) 的值的迭代器
upper_bound(x):返回第一个大于 \(x\) 的值的迭代器
empty():返回是否为空
size():返回大小
join(x):将 \(x\) 树并入当前树,\(x\) 树清空
split(x,y):依据 \(cmp\)_\(fn\) 判断树并分裂,小于等于 \(x\) 为当前树,其余为 \(y\) 树
- 注意!
join要慎用
使用
msjing还没学会,不知道为啥题解要左移和右移,咕咕咕
后话
话说你们不觉得msjing和sbmqwm很好磕吗
- 捏造:人类吗自己磕自己和自己