封装平衡树__gnu_pbds::tree使用瞎搞

前言

  • msjing准备学平衡树,开始到处炫耀她的 \(Treap\) 板子,sbmqwm告诉她可以用 \(pbds\) 来代替手写平衡树,作为蓝蛋的msjing决定学一下

参考

pb_ds简介

  • 这个东东是一个非 C++14 原生的库,其中封装了:平衡树,字典树,哈希表,优先队列,且常数小,好像可以在比赛里用(具体以 \(NOI\) 的文件为准)

准备阶段

头文件的准备

  • \(pbds\) 拥有与 \(std\) 一样的头文件:#include<bits/extc++.h>,但是 \(Dev\) 用不了,不过你可以这样做:
    • 在Dev里写 #include<bits/extc++.h>,报错后点图中框出的报错
      批注 2026-07-09 172742
    • 然后挑要用的 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:\) 包括intlong long等,好像你也可以写pairstruct
    • \(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_keyfind_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很好磕吗
  • 捏造:人类吗自己磕自己和自己
posted @ 2026-07-09 19:29  msjing  阅读(15)  评论(0)    收藏  举报