title : pb_ds
date : 2021-8-21
tags : ACM,数据结构
author : Linno


简介

pb_ds库全称Policy-Based Data Structures。

封装了很多数据结构入哈希表、平衡二叉树、字典树、堆等。

哈希表

声明方式

#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;//查探法(快一点)

声明方法

#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>,binary_heap_tag>pq;//二叉堆
__gnu_pbds::priority_queue<int,greater<int>,binomial_heap_tag>pq;//二顶堆
__gnu_pbds::priority_queue<int,greater<int>,rc_binomial_heap_tag>pq; //配对堆
__gnu_pbds::priority_queue<int,greater<int>,thin_heap_tag>pq;
__gnu_pbds::priority_queue<int,greater<int> >pq;
常用操作
 push() //返回一个迭代器top() //返回堆顶size() //返回大小empty() //判断是否为空clear() //清空堆pop() //弹出堆顶元素join(priority_queue,&other) //合并两个堆.other会被清空split(Pred prd,priority_queue &other) //分离除两个堆modify(point_iterator it,const key //修改一个节点的值)

更多用法

begin()begin()begin()和end()end()end()来获得iteratoriteratoriterator从而遍历

可以increase_key,decrease_keyincrease\_key,decrease\_keyincrease_key,decrease_key和删除单个元素

可以合并

__gnu_pbds::priority_queue<int>::point_iterator it; //迭代器

红黑树

声明方式
#include<ext/pb_ds/tree_policy.hpp>
#include<ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>t;
/*定义一颗红黑树,
int为关键字类型,
null_type无映射,
less从小到大排序,
rb_tree_tag红黑树(splay_tree_tag),
tree_order_statistics_node_update节点更新
*/
常用方法
t.insert()//插入
t.erase()//删除
t.order_of_key(k);//求k在树中是第几大
t.find_by_order(k); //求树中的第k大
t.lower_bound();//前驱
t.upper_bound();//后继
a.join(b)//b并入a,前提是两棵树的key的取值范围不相交
a.split(v,b)//key小于等于v的元素属于a,其余的属于b
t.lower_bound(x)//>=x的min的迭代器
t.upper_bound(x)//>x的min的迭代器
迭代器
tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>::iterator it;//也可以使用auto来判断
洛谷3369题解

修改了前辈的板子,位运算的意义是去重。

用splay_tree_tag的话会T掉一个点,改成红黑树就可以过了。

//luoguP3369 【模板】普通平衡树
#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;
typedef long long ll;
tree<ll,null_type,std::less<ll>,rb_tree_tag,tree_order_statistics_node_update>sp;
ll T,ans,op,x;
signed main(){scanf("%lld",&T);for(int i=1;i<=T;i++){scanf("%lld%lld",&op,&x);if(op==1) sp.insert((x<<20)+i); //去重 else if(op==2)sp.erase(sp.lower_bound(x<<20));else if(op==3)printf("%lld\n",sp.order_of_key(x<<20)+1); else{if(op==4)ans=*sp.find_by_order(x-1);if(op==5)ans=*--sp.lower_bound(x<<20); if(op==6)ans=*sp.lower_bound((x+1)<<20);printf("%lld\n",ans>>20);}}return 0;
}

参考资料

OI -wiki

《C的pb_ds库在OI中的应用》于纪平
pb_ds库的一些常用方法 CSDN

【学习笔记】用算法题介绍C++的pb_ds库中的可并堆 TRiddle

P3369 【模板】普通平衡树(Treap/SBT)(pb_ds版)自为风月马前卒

【算法竞赛学习笔记】pb_ds-超好懂的数据结构相关推荐

  1. 【算法竞赛学习笔记】超好懂的斯坦纳树详解!!!

    title : 斯坦纳树 tags : ACM 图论 date : 2021-6-26 author : Linno 什么是斯坦纳树 给定 n 个点 A1,A2,⋯,An试求连接此n个点,总长最短的直 ...

  2. 【算法竞赛学习笔记】快速傅里叶变换FFT-数学提高计划

    tilte : 快速傅里叶变换FFT学习笔记 tags : ACM,数论 date : 2021-7-18 简介 FFT(Fast Fourier Transformation),中文名快速傅里叶变换 ...

  3. 【算法竞赛学习笔记】Link-Cut-Tree基础-超好懂的数据结构

    titile : Link-Cut-Tree time : 2021-7-21 tags : ACM,数据结构 author : Linno LCT Link-Cut-Tree,中文名为动态树,是一种 ...

  4. 【算法竞赛学习笔记】莫队算法-超优雅的暴力算法

    title : 莫队算法 tags : ACM,暴力 date : 2021-10-30 author : Linno 普通莫队 常用操作:分块/排序/卡常/离散化等,直接上板子. luoguP270 ...

  5. 【算法竞赛学习笔记】KD-Tree

    title : KD-Tree date : 2022-4-7 tags : ACM,数据结构 author : Linno K-D tree K-D树是在k维欧几里得空间中组织点的数据结构.在算法竞 ...

  6. 【算法竞赛学习笔记】状压DP

    title : 状压DP date : 2022-3-5 tags : ACM,图论,动态规划 author : Linno 状压DP 状态压缩,是利用二进制数的性质对问题进行优化的一种算法,经常与搜 ...

  7. 【算法竞赛学习笔记】离散对数与BSGS-数学提升计划

    title : 离散对数与BSGS date : 2021-8-12 tags : ACM,数论 author Linno 阶 对与m互质的整数a,我们记满足an≡1modma^n\equiv 1\m ...

  8. 【算法竞赛学习笔记】佩尔方程-数学提升计划

    title : 佩尔方程 date : 2021-10-31 tags : ACM,数学 author : Linno 佩尔方程 形如x2−dy2=1(d>1且d不为完全平方数)x^2-dy^2 ...

  9. 【算法竞赛学习笔记】后缀自动机SAM-超经典的字符串问题详解

    title : 后缀自动机 date : 2021-11-11 tags : ACM,字符串 author : Linno 前置知识 KMP,Trie,AC自动机等字符串基础 DFA(有限状态自动机) ...

最新文章

  1. ajax按钮禁止重复提交,Ajax禁止重复提交
  2. ARMS企业级场景被集成场景介绍
  3. MySQL5.7参数log_timestamps
  4. jsf xhtml调用方法_JSF的工作方式以及调试方法–可以使用polyglot吗?
  5. python增强对比度_python增加图像对比度的方法
  6. Sharepoint学习笔记—架构系列
  7. C++语言 如何用G++进行编译和运行程序
  8. 这个统一了238个机器学习模型R包的参考手册推荐给你
  9. kmo检验和bartlett球形检验_互助问答59期:多期DID平行趋势检验以及因子分析累计方差贡献率...
  10. 大学生必学练习题 - C 语言经典50例
  11. (20200108)matlab弹出对话框形式打开和读取指定文件,不用提前输入文件名——uigetfile
  12. ubuntu18.04: 安装nanomsg
  13. ASP.NET入门基础教程查看
  14. html5ie11缩放,IE 11 页面缩放后再次打开不能保存之前的缩放比例
  15. gwas snp 和_GWAS,SNP,和疾病
  16. 全球医疗实力排名:各国差距有多大?
  17. 池州计算机一级考试试题题库,池州科目一考试题库
  18. 西西吹雪:从程序员到项目经理(二)
  19. buildroot认知
  20. 半路出家当程序员容易吗?怎样才能拿高薪?

热门文章

  1. Android所有动画分类总结
  2. C语言 求一元二次方程ax2+bx+c=0的根
  3. 机器学习入门之流浪地球
  4. 计算机网络知识全面讲解:Internet中常见的应用协议
  5. 人工智能chatgpt的国内的稳定镜像
  6. 【Arduino 和 DS3231 实时时钟教程】
  7. 大学计算机课试题答案,大学计算机基础试题及答案课件.doc
  8. 【愚公系列】2022年09月 微信小程序-WebGL画渐变色正方形
  9. 解决 iOS 上 transform rotate 兼容问题
  10. 毕业设计-基于微信小程序的在线考试系统