首页 > 其他分享 >[OI] pb_ds

[OI] pb_ds

时间:2024-07-09 12:20:29浏览次数:5  
标签:__ 迭代 OI gnu tree pb tag heap 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;

字典树

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

标签:__,迭代,OI,gnu,tree,pb,tag,heap,ds
From: https://www.cnblogs.com/HaneDaCafe/p/18291425

相关文章

  • Android |(六)基础控件10 RecycleView 滑动【进阶】
      RecyclerView是官方在5.0之后新添加的控件,推出用来替代传统的ListView和GridView列表控件。一、RecycleView(一)总:添加RecycleView控件(1)activity_main中(2)初始化 (3)setLayoutManager()listRv.setLayoutManager(newLinearLayoutManager(this));RecyclerView提供......
  • Android全局替换字体
    一、概述由于业务需要,各端之间统一字体(Android、IOS、PC、网页)。所以android也需要替换成特定的字体。以后有可能还会增加其他的字体。方案:使用LayoutInflaterCompat.setFactory2来全局替换字体。这样做的好处是可以一次性的替换大部分的字体。剩余的个性......
  • 纯小白uni-app+Android Studio离线打包
    一、HBulderX(1)cloud:开发者中心 注册登录(2)HBulderX登录开发者中心的账号,创建uni-app项目-》test,此时点击test下文件mainfest.json,会出现如下uni-app的AppID 同时在CLOUD上也会出现此项目,注意,项目名称和AppID要对上 (3)HBulderX本地打包 打包结果如下,期间要下什么插件,就让......
  • APB总线介绍
    Ref:https://www.cnblogs.com/xianyuIC/p/17279209.htmlIntroductionAPB是最简单的AMBA总线,功耗很低,它多用于低速外围设备和访问寄存器。相比AHB和AXI,有几个很不一样的点:最快只能背靠背(backtoback)传输,至少2个周期传输一个数据,PSEL起来然后PENABLE起来。(背靠背传输,即连续传......
  • NOIP模拟1
    赛时rank3,95,30,40,5,5赛后hack,rank7,40,30,40,5,5\(太CAI了\)T1分糖果简要题意:将\(n\)个数分成最多组,使得每组有\(3\)个人,每组的数字和能被\(3\)整除,输出组数和方案\(n≤10^5,1≤a_i≤10^5\)\(solution:\)将每个数\(\mod3\)存入,则有三类:余数为0,1,2;可以的方案有三种\(0,0,0\),\(0,......
  • P2964 [USACO09NOV] A Coin Game S (博弈论 dp)
    P2964[USACO09NOV]ACoinGameS博弈论dp(乱取的)两个人都希望自己的价值最大,可以认为他俩是等价的。考虑设计dp状态,设\(f_{i,j}\)表示考虑了前\(i-1\)个,现在的先手\([i,i+j-1]\)个,他之后能得到的最大价值。转移肯定是从\(f_{i+j,k}\)转移过来,并且\(1\lek\le2j\)......
  • 在audio DSP中如何做软件固化
     在audioDSP中,软件的code和data主要放在3种不同的memory上,分别是片内的ITCM、DTCM和片外的memory(比如DDR)上。ITCM只能放code,DTCM只能放data,片外的memory既能放code也能放data。在写代码时要规划好哪些放片内,哪些放片外。上面说的这三种memory都属于RAM(randomaccessmemory,随......
  • Android:如何绘制View
    点击查看Android如何绘制视图官网一、简介Android框架会在Activity获得焦点时请求Activity绘制其布局。Android框架会处理绘制流程,但该Activity必须提供其布局层次结构的根节点。Android框架会绘制布局的根节点,并测量和绘制布局树。它会通过遍历布局树并渲染......
  • mormot.core.threads--TSynParallelProcess
    mormot.core.threads--TSynParallelProcess{************线程池中的并行执行}type///TSynParallelProcess的并行化过程回调//-如果0<=IndexStart<=IndexStop,则应执行某些过程TOnSynParallelProcess=procedure(IndexStart,IndexStop:integer)ofobject;......
  • mormot.core.threads--TSynBackgroundThreadMethod
    mormot.core.threads--TSynBackgroundThread在mORMot2框架中,TSynBackgroundThreadEvent、TSynBackgroundThreadMethod、TSynBackgroundThreadProcedure、TSynBackgroundThreadProcess和TSynBackgroundTimer这几个类虽然都涉及到后台线程的执行,但它们各自有不同的用途和设计目标......