pbds学习笔记

头文件及命名空间

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

优先队列

通常会使用配对堆
定义__gnu_pbds::priority_queue<int,greater<int>,pairing_heap_tag> q;
这是小根堆,如果要大根堆的话把中间那个换成\(\text{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\)的值是多少(\(k\)\(0\)开始),返回迭代器
k=order_of_key(x):查询\(x\)的排名(\(k\)\(0\)开始,\(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的平衡树不能插入相同元素,但可以将类型改为\(\text {pair}\),同时记录时间戳即可

rope(块状链表)

posted @ 2024-01-12 10:32  hubingshan  阅读(262)  评论(0)    收藏  举报