[小丁笔记] pb_ds & less<>

平衡树

头文件

#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;
};
posted @   Aireen_Ye  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
底部 顶部 留言板 归档 标签
Der Erfolg kommt nicht zu dir, du musst auf den Erfolg zugehen.



点击右上角即可分享
微信分享提示