平衡树
头文件
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
特点
- 不支持重复元素,但可以pair或结构体凑合一下
- 支持更多的平衡树操作 求排名、找第k大、树合并、树分裂
- 第k大(第k小)的编号从0开始
- 存在自定义和维护节点信息的接口
- 偏向工程,所以常数较大
- 封装了红黑树、splay树、avl树
速度
- 开了O2后可以当作大常数的平衡树使用
- splay和rbtree谁快看运气
- 没开O2很容易t
- 适合用在小题大做的时候,因为代码量真的很小
声明
tree<pii,null_type,less<pii>,rb_tree_tag,tree_order_statistics_node_update> tr;
- pii: 存储的类型
- null_type: 无映射 (低版本g++为null_mapped_type)
- less<pii>: 从小到大排序(或者greater<>)
- rb_tree_tag: 红黑树(或者 splay_tree_tag)
- tree_order_statistics_node_update //更新方式
函数功能
#define p pair<int,int>
#define mp(x,y) make_pair(x,y)
tr.insert(mp(x,y)); //插入
tr.erase(mp(x,y)); //删除
tr.order_of_key(p(x,y)); //求排名
tr.find_by_order(x); //找k小值,返回迭代器
tr.join(b); //将b并入tr,前提是两棵树类型一样且没有重复元素
tr.split(v,b); //分裂,key小于等于v的元素属于tr,其余的属于b
tr.lower_bound(x); //返回第一个大于等于x的元素的迭代器
tr.upper_bound(x); //返回第一个大于x的元素的迭代器
//以上所有操作的时间复杂度均为O(logn)
less<> 和 greater<>
- 是一种函数的模板,是一个结构体化的函数
- 目的大概是将操作符当作对象来传递
c++11 中的实现
template <class T> struct less {
bool operator() (const T& x, const T& y) const {return x<y;}
typedef T first_argument_type;
typedef T second_argument_type;
typedef bool result_type;
};