首页 > 其他分享 >如何优雅地使用 pb_ds

如何优雅地使用 pb_ds

时间:2023-10-26 12:25:27浏览次数:30  
标签:头文件 行是 tree 优雅 pb tag include ds

如何优雅地使用 pb_ds

定义头文件

总所周知,dev 年久失修,对这种高端科技并不是很支持,直接背头文件又长又臭。

但如果使用的其他高端编辑器,你可以直接写:

#include<bits/extc++.h>

使用dev的话你也需要先写这个,然后编译会出错。

大概是

image-20231026100426700

点击下面编译错误的加粗的第一行,然后你就进入到

image-20231026100622547

将第 60-66 行复制到你的 cpp 中即可(也就是复制后缀为.hpp)。

这七行代码分别的意思是:

第 60 行是类似于迭代器之类的东西,在你使用 hash,list,tree,trie 时必须带上,否则可能出现神秘错误,priority_queue不需要带上。

第 61 行是priority_queue的专用头文件。

第 62 行是调试差错的工具,能有效的帮你找到的你使用的 pb_ds 在哪个调用哪个函数的时候出锅了,非常良心,建议带上。

第 63 行是 hash 的专用头文件,第 64 行是 list 的专用头文件,第65行是 tree 的专用头文件,第66行是 trie的专用头文件。

如果你想我一样懒的话其实也都不用管,直接无脑复制所有即可。

由于 pb_ds 是封装在一个 namespace 里面的,所以为了方便,加上:

using namespace __gnu_pbds;

所以我的头文件板子为:

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/priority_queue.hpp>
#include <ext/pb_ds/exception.hpp>
#include <ext/pb_ds/hash_policy.hpp>
#include <ext/pb_ds/list_update_policy.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/trie_policy.hpp>
using namespace __gnu_pbds;

你只需要背诵 pb_ds 万能头即可。

tree

主要用于替代手写的简单平衡树。

定义变量:

tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>T;

定义一共需要 5 个参数,第一个是你插入进去的数的类型,第二个是一个必要参数,只有死记,第三个是你的比较函数,可以将 less 内部的 int 改为你自己定义的 cmp 函数,第四个是 tag,pbds内部实现了3种tag,分别为 rb_tree_tag,splay_tree_tag,ov_tree_tag,其中第二种 tag 速度较慢,第三种 tag 功能不全,所以建议无脑选 rb_tree_tag 即可,最后那个也是无脑背即可,背不下来咋办?。

按住 ctrl 点击

#include <ext/pb_ds/tree_policy.hpp>

翻到第 146 行复制即可。

功能包括:set 全家桶,以及 order_of_key,find_by_order,join,spilt 函数。

T.order_of_key(x):查询任意一个数 \(x\) 的排名,返回值为小于这个数的总个数,所以算排名的时候值要加一。

T.find_of_key(x):查询排名为 \(x\) 的数,由于内部实现是排名是从 \(0\) 开始的,所以查询的时候要减一。

T.join(a):将 \(a\) 这颗树合并到 \(T\) 中,并将 \(a\) 清空,使用这个函数有个大前提,需要满足一棵树的最小值大于另一颗数的最大值,若不满足此前提只有启发式合并来做,速度略慢。

T.spilt(x,a) :将 \(T\) 分裂成两颗树,小于等于 \(x\) 的属于 \(T\),大于 \(x\) 的属于 \(a\)

tree 会自动去重,即相同的数只保留一个,所以要保留多个相同数的时候,建议写结构体或者用 double 扰动(笔者认为前者更优)

priority_queue

主要用于替代可并堆,复杂度比启发式合并优秀。

定于变量:由于 c++ 中有常规的 priority_queue,所以直接定义会重名。

#define heap __gnu_pbds::priority_queue
heap<int>q;

pbds也实现了很多功能,默认的tag为配对堆,在复杂度以及功能完整性上都十分优秀,建议不用更改tag

主要功能包括:常规priority_queue全套,以及 erase,modify,join 函数

q.erase(t) :删除迭代器 \(t\) 位置的值。

q.modify(t,x):将迭代器 \(t\) 的值更改为 \(x\)

q.jion(a):将堆 \(a\) 合并到 \(q\) 中,并将 \(q\) 清空。

hash_table

主要替代 unordered_map,在对卡常中有所作用。

定于变量:

cc_hash_table<int,int>mp;
gp_hash_table<int,int>mp;

一共就这两种tag,网上对这俩的速度谁快一直争论不休。

个人认为 cc 快一下

功能同 unordered_map 一样

标签:头文件,行是,tree,优雅,pb,tag,include,ds
From: https://www.cnblogs.com/Hanghang007/p/17789124.html

相关文章

  • EF Core无法翻译groupby等子查询
    烦人的表达式转化错误varquery1=emps.Grouby(v=>v.DeptId).Select(g=>new{DeptId=g.Key,Salary=g.Max(x=>x.Salary);varresult=fromdindeptsjoinqinquery1ond.Idequalsq.DeptIdselectnew{d.Name,q.Salary};上面代码运行起......
  • ATGM336H-5N一款高性能BDS/GNSS全星座定位导航模块
    功能概述ATGM336H-5N系列模块是9.7X10.1尺寸的高性能BDS/GNSS全星座定位导航模块系列的总称。该系列模块产品都是基于中科微第四代低功耗GNSSSOC单芯片--AT6558,支持多种卫星导航系统,包括中国的BDS(北斗卫星导航系统),美国的GPS,俄罗斯的GLONASS,欧盟的GALILEO,日本的QZSS以及......
  • 【论文阅读笔记】【OCR-文本识别】 Towards Accurate Scene Text Recognition with Se
    SRNCVPR2020读论文思考的问题论文试图解决什么问题?如何利用文本的上下文语义信息来辅助文本识别任务RNN能部分利用语义信息,但它的利用方式是串行的,极大地限制了语义信息的帮助,会造成错误累积以及效率缓慢等问题文章提出了什么样的解决方法?提出全局语义理解......
  • # yyds干货盘点 # PD有随机填充的功能吗?有无什么随机填充的方法啊?
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【黑科技·鼓包】问了一个Pandas数据库数据处理的问题,一起来看看吧。PD有随机填充的功能吗?例如我有类似的第一列PD数据的话没有NA值,我希望在第二列生成指定数量例如300条(比左侧少)随机位置的固定字符串。有无什么随机填充的方......
  • cdp Page.addScriptToEvaluateOnNewDocument
     加载新页面之前插入自定义的JavaScript脚本  selenium过环境检测```pythonwithopen(path+'/stealth.min.js')asf:js=f.read()driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{"source":js})``` ......
  • NMDS分析中的Stress、Adonis、Anosim
    在非度量多维缩放(NMDS,Non-metricMultidimensionalScaling)中,"Stress"(应力值)是一个关键的统计量。它提供了对模型质量的评估。这里是其核心含义:Stress值的定义:它是原始距离和NMDS得到的低维空间距离之间的误差的度量。更具体地说,它是实际生态距离与NMDS映射在低维空间中的距......
  • 【Springboot文件上传】前后端双开,大文件秒传、断点续传的解决方案和优雅实现
    思路和解决方案探讨秒传这里指的“秒传”,是指:当用户选择上传一个文件时,服务端检测该文件之前是否已经被上传过,如果服务器已经存有该文件(完全一样),就立马返回前端“文件已上传成功”。前端随即将进度条更新至100%。这样给用户的感觉就是“秒传”的感觉。对于每一个上传到服务......
  • 公司新来了个同事,代码写得是真优雅呀!代码如诗!
    来源:https://www.cnblogs.com/liuboren/p/17017421.html0.前言本篇文章是<<代码整洁之道>>的学习总结,通过这篇文章你将了解到整洁的代码对项目、公司和你的重要性,以及如何书写整洁的代码.通过命名、类、函数、测试这四个章节,使我们的代码变得整洁.1.为什么要保持代码整洁?......
  • 用Python发一个优雅的朋友圈,1行代码搞定
    大家好,这里是程序员晚枫,这段时间给大家分享多个微信自动化的代码:今天再给大家分享一个:用Python发一个好看的朋友圈的代码。效果展示最近很多P图软件实现了一个效果:把一张图片分成9张,如下图所示。......
  • # yyds干货盘点 #使用Python随机查询数据库中10个信息然后删除这10个信息
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【刘苏秦】问了一个Python数据库数据处理的问题,一起来看看吧。cursor=connect.cursor()sql="SELECT*FROMinfoswherestatus=''"cursor.execute(sql)result=random.sample(cursor.fetchall(),10)result=[dict(i......