[小丁笔记] 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 @ 2022-02-21 22:52  Aireen_Ye  阅读(28)  评论(0编辑  收藏  举报
底部 顶部 留言板 归档 标签
Der Erfolg kommt nicht zu dir, du musst auf den Erfolg zugehen.