C++ __gnu_pbds(hash,可并堆,平衡树)

pb_ds 是GNU-C++自带的一个C++的扩展库,其中实现了很多数据结构,比STL里面的功能更强大

#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>   // 用tree
#include<ext/pb_ds/hash_policy.hpp>   // 用hash
#include<ext/pb_ds/trie_policy.hpp>   // 用trie
#include<ext/pb_ds/priority_queue.hpp>// 用priority_queue
using namespace __gnu_pbds;
---
#include<bits/extc++.h>
using namespace __gnu_pbds;
//bits/extc++.h与bits/stdc++.h类似,bits/extc++.h是所有拓展库,bits/stdc++.h是所有标准库

哈希表

其中cc开头为拉链法,gp开头为探测法,个人实测探测法稍微快一些。

啥?操作?其实就和map差不多,支持[ ]和find。

#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
using namespace __gnu_pbds;cc_hash_table<string,int>mp1;//拉链法
gp_hash_table<string,int>mp2;//查探法(快一些)

说明:

在不允许使用C++11的时候,pb_ds库中的两种hash函数比map的效率大大提高 ,可以代替map作为一个哈希工具,使用方法和map完全一样,一般来说查探法的效率更高

可并堆

需要的头文件:

用法和普通的优先队列一样

#include<ext/pb_ds/priority_queue.hpp>
using namespace __gnu_pbds;
__gnu_pbds::priority_queue<int>q;//因为放置和std重复,故需要带上命名空间
__gnu_pbds::priority_queue<int,greater<int>,pairing_heap_tag> q;//最快
__gnu_pbds::priority_queue<int,greater<int>,binary_heap_tag> q;
__gnu_pbds::priority_queue<int,greater<int>,binomial_heap_tag> q;
__gnu_pbds::priority_queue<int,greater<int>,rc_binomial_heap_tag> q;
__gnu_pbds::priority_queue<int,greater<int>,thin_heap_tag> q;
__gnu_pbds::priority_queue<int,greater<int> > q;

pb_ds库的堆提供了五种tag,分别是binary_heap_tagbinomal_heap_tagpairing_heap_tagthin_heap_tagrc_binomal_heap_tag。 因为重名的原因一定要加上 __gnu_pbds::
在这里插入图片描述

常用操作:

push()  //会返回一个迭代器
top()    //同 STL
size()   //同 STL 
empty()  //同 STL 
clear()  //同 STL 
pop()    //同 STL 
join(priority_queue &other)            //合并两个堆,other会被清空
split(Pred prd,priority_queue &other)  //分离出两个堆
modify(point_iterator it,const key)    //修改一个节点的值

平衡树

#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>using namespace __gnu_pbds;
template<typename T>
using ordered_set = tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;// rb_tree_tag 和 splay_tree_tag 选择树的类型(红黑树和伸展树)
T // 自定义数据类型
null_type//无映射(老版本g++为null_mapped_type)
less<T>//Node的排序方式从小到大排序
tree_order_statistics_node_update//参数表示如何更新保存节点信息 tree_order_statistics_node_update会额外获得order_of_key()和find_by_order()两个功能。ordered_set<Node> Tree;  // Node 自定义struct 注意重载less
Tree.insert(Node);       // 插入
Tree.erase(Node);        // 删除
Tree.order_of_key(Node); // 求Node的排名:当前数小的数的个数 +1
Tree.find_by_order(k);   // 返回排名为k+1的iterator 即有k个Node比*it小
Tree.join(b);            // 将b并入Tree,前提是两棵树类型一致并且二没有重复元素
Tree.split(v, b);        // 分裂,key小于等于v的元素属于Tree,其余属于b
Tree.lower_bound(Node);  // 返回第一个大于等于x的元素的迭代器
Tree.upper_bound(Node);  // 返回第一个大于x的元素的迭代器//以上的所有操作的时间复杂度均为O(logn)
//注意,插入的元素会去重,如set
ordered_set<T>::point_iterator it=Tree.begin();  // 迭代器
//显然迭代器可以++,--运算

P3369 【模板】普通平衡树

因为tree里不能有相同的数,但是实际会插入相同的数,所以把这些数左移20位在加上一个常数操作(n<220n<2^{20}n<220,如果a<ba<ba<b,那么一定有{(a<<20)+n}<{b<<20}\{(a<<20) +n\}<\{b<<20\}{(a<<20)+n}<{b<<20},这样就保证了在不影响相对大小关系的情况下,消除了相同的数。

别的操作看代码就可以理解了,非常巧妙的搞定了相同数的情况。

rb_tree_tag

#include<bits/stdc++.h>
#include<ext/pb_ds/tree_policy.hpp>
#include<ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
using ll=long long;template <class T=int> T rd()
{T res=0;T fg=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') fg=-1;ch=getchar();}while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res*fg;
}
template<typename T>
using ordered_set = tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;const int N=100010;
int n,m;
ll k,ans;
ordered_set<ll> T;
int main()
{n=rd();for(int i=1;i<=n;i++){int op=rd();k=rd<ll>();if(op==1) T.insert((k<<20)+i);if(op==2) T.erase(T.lower_bound(k<<20));if(op==3) printf("%d\n",T.order_of_key((k<<20))+1);if(op == 4)ans=*T.find_by_order(k-1),printf("%lld\n",ans>>20);if(op == 5)ans=*--T.lower_bound(k<<20),printf("%lld\n",ans>>20);if(op == 6)ans=*T.upper_bound((k<<20)+n),printf("%lld\n",ans>>20);}return 0;
}

splay_tree_tag

Code from

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <map>
#include <ext/pb_ds/assoc_container.hpp> 
using namespace std;
using namespace __gnu_pbds;
#define Node pair<int,int>
map <int,int> s;
tree< Node ,null_type,less< Node >,splay_tree_tag,tree_order_statistics_node_update> T;
int n,op,x;
int main()
{scanf("%d",&n);for(register int i = 1; i <= n; i++)switch(scanf("%d%d",&op,&x), op){case 1 :T.insert(Node(x,s[x]++));break;case 2 :T.erase(Node(x,--s[x]));break;case 3 :printf("%d\n",(int)T.order_of_key(Node(x,0))+1);break;case 4 :printf("%d\n",T.find_by_order(x-1)->first);break;case 5 :printf("%d\n",T.find_by_order(T.order_of_key(Node(x,0))-1)->first);break;case 6 :printf("%d\n",T.find_by_order(T.order_of_key(Node(x,s[x]-1))+(T.find(Node(x,0)) == T.end() ? 0 : 1))->first);break;default:break;}return 0;
}

底层代码


参考以及进阶

比STL还STL?——平板电视
pb_ds库的一些常用方法
C++ __gnu_pbds(平板电视)超详细教程(C++内置的平衡树,字典树,hash)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318671.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

理解至上:二叉堆与优先队列详细用法

文章目录二叉堆概述插入代码访问代码完整代码优先队列&#xff1a;priority_queue基本用法小根堆的声明&#xff1a;结构体注意Thanks for reading&#xff01;二叉堆 概述 为什么不用pq呢 算比较简单的数据结构了 它可以用log的时间复杂度插入元素和访问&#xff08;取出&am…

ASP.NET Core 搭配 Nginx 的真实IP问题

一.前言Nginx&#xff08;Engine X&#xff09;是一个高性能HTTP和反向代理服务&#xff0c;是由俄罗斯人伊戈尔赛索耶夫为访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;第一个公开版本0.1.0发布于2004年10月4日。 如果…

不止代码:保留道路(ybtoj 最小生成树)

文章目录题目描述解析代码thanks for reading!题目描述 解析 其实就是修建道路 我一开始只能想到枚举g去跑最小生成树 是m^2的算法&#xff08;50pts&#xff09; 但是其实每次加入的边只有一条 而且之前都不在最小生成树上的边以后也肯定不会在 所以可以建一个新的边的集合存…

不止代码:路径数量(ybtoj-最小生成树)

文章目录题目描述解析代码题目描述 解析 乍一看&#xff1a;是个水题啊&#xff01; 显然如果途径存在强连通的点&#xff0c;路径就会变为正无穷 所以缩点加拓扑dp以及一些特判应该就可以解决了&#xff01; 一交&#xff1a;40分。。。 然后就开始拆东墙补西墙的debug。。。…

重磅!!!微软发布.NET Core 2.2

我们很高兴地宣布发布.NET Core 2.2。它包括对运行时的诊断改进&#xff0c;对ARM32 for Windows和Azure Active Directory for SQL Client的支持。此版本中最大的改进是在ASP.NET Core中。ASP.NET Core 2.2和Entity Framework Core 2.2。您可以在Windows&#xff0c;macOS和Li…

[翻译] ASP.NET Core 2.2 正式版发布

本文为翻译&#xff0c;原文地址&#xff1a;https://blogs.msdn.microsoft.com/webdev/2018/12/04/asp-net-core-2-2-available-today/我&#xff08;文章作者&#xff09;很高兴地宣布ASP.NET Core 2.2现在作为.NET Core 2.2的一部分提供&#xff01;怎么获取它您可以从 .NET…

理解至上:数位dp(ybtoj-B数计数)

文章目录简要题目描述解析dp定义:试填法代码thanks for reading&#xff01;简要 数位dp&#xff0c;天下第一 最重要的应该有两个&#xff1a; 1.状态转移式的确定 2.试填法不断往后模拟 &#xff08;至今是唯一一道数位dp&#xff0c;究竟重要的是啥我其实也没有太多经验 &am…

2021“MINIEYE杯”中国大学生算法设计超级联赛(10)Pty loves string(Border+二维数点)

Pty loves string 建立Border树后&#xff0c;发现可以转化成两个子树中相同点的数量&#xff0c;时间戳转化为连续的区间后相当于有两个数组&#xff0c;每次给两个区间&#xff0c;问区间相同点权的数目。 第一个数组作为区间&#xff0c;第二个数组作为权值。将第一个数组建…

微软推出了Cloud Native Application Bundles和开源ONNX Runtime

微软的Microsoft Connect(); 2018年的开发者大会 对Azure和IoT Edge服务进行了大量更新; Windows Presentation Foundation&#xff0c;Windows Forms和Windows UI XAML Library的开源 以及.NET 基金会会员模型的扩展。但那些只是冰山一角。微软还联合Docker发布了Cloud Native…

不止代码:友好城市(动态规划)

解析 先按左端点排序得到一个右端点的新队列&#xff0c;然后就可以发现&#xff1a; 所有合法的方案都是新队列的一个单调递增队列 然后就转化成了最长上升序列的问题 代码 #include<bits/stdc.h> using namespace std; const int N1e6100; int m,n; struct node{int…

二分图匹配(一)

文章目录什么是二分图&#xff1a;例题&#xff1a;NC111768 CF741C题目描述&#xff1a;题解&#xff1a;代码&#xff1a;二分图最大匹配匈牙利算法算法思想&#xff1a;代码&#xff1a;Knig定理二分图最优匹配KM(Kuhn-Munkres)算法算法思路&#xff1a;具体操作代码&#x…

不止代码:恐狼后卫(ybtoj-区间dp)

文章目录题目描述解析代码thanks for reading!题目描述 一代炉石的眼泪啊 解析 用dp[i][j]表示i与j之间的全部消掉&#xff08;不含两端&#xff09;的最小花费 然后枚举中间最后杀死的狼就行了 本题没有一次AC&#xff0c;因为一开始dp定义成了包含两端&#xff0c;然后因为…

牛客题霸 [二叉树的之字形层序遍历] C++题解/答案

牛客题霸 [二叉树的之字形层序遍历] C题解/答案 题目描述 给定一个二叉树&#xff0c;返回该二叉树的之字形层序遍历&#xff0c;&#xff08;第一层从左向右&#xff0c;下一层从右向左&#xff0c;一直这样交替&#xff09; 例如&#xff1a; 给定的二叉树是{3,9,20,#,#,15…

【.NET Core项目实战-统一认证平台】第九章 授权篇-使用Dapper持久化IdentityServer4...

上篇文章介绍了IdentityServer4的源码分析的内容&#xff0c;让我们知道了IdentityServer4的一些运行原理&#xff0c;这篇将介绍如何使用dapper来持久化Identityserver4&#xff0c;让我们对IdentityServer4理解更透彻&#xff0c;并优化下数据请求&#xff0c;减少不必要的开…

不止代码:生日欢唱(ybtoj-区间dp)

文章目录题目描述解析代码thanks for reading&#xff01;题目描述 解析 这题挺好的 思路&#xff1a;dp[i][j]表示必须把i和j配对&#xff0c;可达到的最大值 首先&#xff1a; dp[i][j]dp[i-1][j-1]a[i]*b[j];然后可以分别尝试把男生或女生往前放弃一段&#xff1a; for(i…

打造自己的.NET Core项目模板

前言每个人都有自己习惯的项目结构&#xff0c;有人的喜欢在项目里面建解决方案文件夹&#xff1b;有的人喜欢传统的三层命名&#xff1b;有的人喜欢单一&#xff0c;简单的项目一个csproj就搞定。。反正就是萝卜青菜&#xff0c;各有所爱。可能不同的公司对这些会有特定的要求…

超好用的C#控制台应用模板

默认模板之缺在工作学习中&#xff0c;我们经常需要创建一些简单的控制台应用(Console App)去验证某个想法&#xff0c;或者作为小工具交付给其他同事。通常我们的选择是 Visual Studio 自带的 Console App 模板&#xff0c;这个经典模板只有预设好的 csproj 文件和空荡荡的 Ma…

不止代码:区间圆数(ybtoj-数位DP)

文章目录题目描述解析理解万岁&#xff01;代码题目描述 解析 一寸山河一寸血 理解万岁&#xff01; 首先&#xff0c;这题统计[l,r]的个数&#xff0c;可以用[1,r]-[1,l-1]来实现 接下来就是如何统计出[1,n]的个数了 首先&#xff0c;用dp[pos][s0]来表示一个二进制pos位有s…

.NET Core 2.2 新增部分功能使用尝鲜

前言美国当地时间12月4日&#xff0c;微软2019开发者大会中发布了一系列的重磅消息&#xff0c;包含了软硬件和开源社区的各种好消息是铺天盖地&#xff0c;作为一名普通的开发者&#xff0c;我第一时间下载了 .NET Core 2.2 的源码&#xff0c;针对发布说明逐条浏览&#xff0…

不止代码:机器分配(动态规划)

题目描述 解析 头疼 什么破题 就是一个dp寻找最优性决策的常规题 但是要输出过程&#xff0c;可以使用递归输出 但是&#xff01; 这题数据的意思是&#xff1a;存在a[i]a[i1]的情况&#xff0c;且在不影响利润的情况下&#xff0c;机器要尽可能的用完 这河里吗 可能是机器多了…