pbds学习笔记

头文件及命名空间

万能头:#include<bits/extc++.h>
命名空间:using namespace __gnu_pbdsusing namespace __gnu_cxx

优先队列

通常会使用配对堆
定义__gnu_pbds::priority_queue<int,greater<int>,pairing_heap_tag> q;
这是小根堆,如果要大根堆的话把中间那个换成less<int>

定义迭代器__gnu_pbds::priority_queue<int,greater<int>,pairing_heap_tag>::point_iterator its[N];

常用操作:

it=q.push(x):这个操作会返回插入位置对应的迭代器,可以把每个点的迭代器记下来,这样可以随时修改任意点的权值
q.pop()
q.top()
q.size()
q.empty()
q.clear()
q.modify(it,x):将对应迭代器的权值改为 x
q.join(p):将同类型的堆p合并到q上,并清空p

复杂度

这些操作的复杂度都是小于等于 O(logn) 的,部分可做到 O(1),完全优于std堆

哈希

通常使用开放寻址
定义gp_hash_table<int,int> mp;

用法

和map一样

平衡树

通常使用红黑树做内核
定义tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> T;
第三个位置可以自己手写cmp函数

常见用法

T.insert(x)
T.erase(x)
it=T.find_by_order(k):查询排名为k的值是多少(k0开始),返回迭代器
k=order_of_key(x):查询x的排名(k0开始,x可以不在平衡树中)
it=T.lower_bound(x)
it=T.upper_bound(x)
T1.join(T2):把T2插入T1,并删除T2中的元素(必须保证T1,T2取值范围无交)
T1.split(v,T2):把T1中大于v的元素扔到T2中(T2原先的元素会被覆盖)

注意:pbds的平衡树不能插入相同元素,但可以将类型改为pair,同时记录时间戳即可

rope(块状链表)

posted @   hubingshan  阅读(149)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示