[OI] pb_ds

using namespace __gnu_pbds;

Luogu Post#39

1.堆

1.1 基本信息

头文件

#include <ext/pb_ds/priority_queue.hpp>

定义

__gnu_pbds::priority_queue<T,Compare,Tag,[*]Allocator>

[T] : typename
[Compare [=greater<T>/less<T>/comp]] : compare function
[Tag [=pairing_heap_tag]] : Heap Type *1

*1
HeapType 共有 pairing_heap_tag ,binary_heap_tag ,binomial_heap_tag ,rc_binomial_heap_tag ,thin_heap_tag 五种

OI-wiki 如是说:

至少对于 OIer 来讲,除了配对堆的其他四个 tag 都是鸡肋,要么没用,要么常数大到不如 std 的,且有可能造成 MLE,故这里只推荐用默认的配对堆

构造举例

__gnu_pbds::priority_queue<int(,gteater<int>)>;

迭代器

__gnu_pbds ::priority_queue<int>::point_iterator iter;

1.2 成员函数 (Tag=pairing_heap_tag)

push() [\(O(1)\)] 插入元素并返回其迭代器
pop() [\(\Theta(log\ n,n)\)] 删除顶端(极值)元素
top() [\(O(1)\)] 返回顶端(极值)元素
modify(point_iterator,key) [\(\Theta(log\ n,n)\)] 修改迭代器所在位置的值
erase(point_iterator) [\(\Theta(log\ n,n)\)] 删除迭代器位置的元素
join(__gnu_pbds :: priority_queue) [\(O(1)\)] 合并到当前堆(删除另一个堆)
size() [\(O(1)\)]
empty() [\(O(1)\)]

所以,这个堆最大的优点在合并很快,否则还是用 STD 吧.

2.平衡树

2.1 基本信息

头文件

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

定义

__gnu_pbds ::tree<Key,Mapped,Cmp_Fn,Tag,Node_Update,[*]Allocator>

[Key] : typename
[Mapped [Mapped-Policy]=null_type] : *1
[Cmp_Fn=std::less<Key>] : compare function
[Tag=rb_tree_tag] : Tree Type *2
[Node_Update=null_tree_node_update] *3

*1
Mapped 指示了存储容器类型,Mapped=null_type 时近似为 std::set,Mapped=Value 时近似为 std::map<Key, Value>

*2
TreeType 共有 rb_tree_tag ,splay_tree_tag ,ov_tree_tag(类似 ordered_vector) 三种

*3
另外一种参数为 tree_order_statistics_node_update,如果你需要查询排名请使用

构造举例

tree<int,null_type,greater<int>,splay_tree_tag> s;

迭代器

tree<int,null_type,greater<int>,splay_tree_tag>::point_iterator iter;

2.2 成员函数

insert() 插入元素,返回 pair<point_inerator,bool>
erase() 删除 [元素/迭代器],返回 bool
order_of_key() 返回元素的排名
find_by_order() 返回排名对应元素的迭代器
join(tree) 合并两棵树,并删除另一颗(需要保证并入树的键的值域与被并入树的键的值域不相交)
split(Key x,tree b) 小于等于 x 的留在当前树中,否则移到 b 树中
lower_bound()\upper_bound()
empty()
size()

3.哈希表

定义

cc_hash_table<Key,Value>;
gh_hash_table<Key,Value>;

一般来说 cc_hash_table 速度不如 gh_hash_table,不过 gh 会被卡哈希

防止自己被卡哈希的办法(?)

#include<chrono>
const int RANDOM = std::chrono::high_resolution_clock::now().time_since_epoch().count();
struct chash{
    inline int operator()(int x)const{
        return x ^RANDOM;
    }
};
gp_hash_table<int,int,chash> s;

字典树

字典树都不会写你还是回炉重造吧

posted @ 2024-07-09 12:14  HaneDaniko  阅读(32)  评论(0编辑  收藏  举报