【算法竞赛学习笔记】pb_ds-超好懂的数据结构
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-超好懂的数据结构相关推荐
- 【算法竞赛学习笔记】超好懂的斯坦纳树详解!!!
title : 斯坦纳树 tags : ACM 图论 date : 2021-6-26 author : Linno 什么是斯坦纳树 给定 n 个点 A1,A2,⋯,An试求连接此n个点,总长最短的直 ...
- 【算法竞赛学习笔记】快速傅里叶变换FFT-数学提高计划
tilte : 快速傅里叶变换FFT学习笔记 tags : ACM,数论 date : 2021-7-18 简介 FFT(Fast Fourier Transformation),中文名快速傅里叶变换 ...
- 【算法竞赛学习笔记】Link-Cut-Tree基础-超好懂的数据结构
titile : Link-Cut-Tree time : 2021-7-21 tags : ACM,数据结构 author : Linno LCT Link-Cut-Tree,中文名为动态树,是一种 ...
- 【算法竞赛学习笔记】莫队算法-超优雅的暴力算法
title : 莫队算法 tags : ACM,暴力 date : 2021-10-30 author : Linno 普通莫队 常用操作:分块/排序/卡常/离散化等,直接上板子. luoguP270 ...
- 【算法竞赛学习笔记】KD-Tree
title : KD-Tree date : 2022-4-7 tags : ACM,数据结构 author : Linno K-D tree K-D树是在k维欧几里得空间中组织点的数据结构.在算法竞 ...
- 【算法竞赛学习笔记】状压DP
title : 状压DP date : 2022-3-5 tags : ACM,图论,动态规划 author : Linno 状压DP 状态压缩,是利用二进制数的性质对问题进行优化的一种算法,经常与搜 ...
- 【算法竞赛学习笔记】离散对数与BSGS-数学提升计划
title : 离散对数与BSGS date : 2021-8-12 tags : ACM,数论 author Linno 阶 对与m互质的整数a,我们记满足an≡1modma^n\equiv 1\m ...
- 【算法竞赛学习笔记】佩尔方程-数学提升计划
title : 佩尔方程 date : 2021-10-31 tags : ACM,数学 author : Linno 佩尔方程 形如x2−dy2=1(d>1且d不为完全平方数)x^2-dy^2 ...
- 【算法竞赛学习笔记】后缀自动机SAM-超经典的字符串问题详解
title : 后缀自动机 date : 2021-11-11 tags : ACM,字符串 author : Linno 前置知识 KMP,Trie,AC自动机等字符串基础 DFA(有限状态自动机) ...
最新文章
- ajax按钮禁止重复提交,Ajax禁止重复提交
- ARMS企业级场景被集成场景介绍
- MySQL5.7参数log_timestamps
- jsf xhtml调用方法_JSF的工作方式以及调试方法–可以使用polyglot吗?
- python增强对比度_python增加图像对比度的方法
- Sharepoint学习笔记—架构系列
- C++语言 如何用G++进行编译和运行程序
- 这个统一了238个机器学习模型R包的参考手册推荐给你
- kmo检验和bartlett球形检验_互助问答59期:多期DID平行趋势检验以及因子分析累计方差贡献率...
- 大学生必学练习题 - C 语言经典50例
- (20200108)matlab弹出对话框形式打开和读取指定文件,不用提前输入文件名——uigetfile
- ubuntu18.04: 安装nanomsg
- ASP.NET入门基础教程查看
- html5ie11缩放,IE 11 页面缩放后再次打开不能保存之前的缩放比例
- gwas snp 和_GWAS,SNP,和疾病
- 全球医疗实力排名:各国差距有多大?
- 池州计算机一级考试试题题库,池州科目一考试题库
- 西西吹雪:从程序员到项目经理(二)
- buildroot认知
- 半路出家当程序员容易吗?怎样才能拿高薪?