ext 库及 pb_ds 在 OI 中的应用
ext 库在 OI 中的应用
写一个帖子,防止以后忘了。
pb_ds 部分
pb_ds 万能头
#include<bits/extc++.h>
来包含 ext 库中所有的头文件(例如 pb_ds 和 rope)。
但是这句话在非 Ubuntu 环境下可能会显示缺失 iconv.h。 这个在 OI 是可以使用的,因为评测机的 NOI-linux2.0 是 Ubuntu 环境,但如果你考试不开虚拟机是不可以在 Windows 下运行的。
优先队列
由于常数的优劣性,本文只介绍 pairing_heap_tag 配对堆。

Ps:modify 相当于更改一个点的点权,erase 相当于删除一个点,join 相当于合并两个堆,并清空后者,基本替代左偏树。

然而定义却比较复杂。
示例定义:
#include<bits/stdc++.h>
#include <ext/pb_ds/priority_queue.hpp>
using namespace std;
using namespace __gnu_pbds;
__gnu_pbds::priority_queue<int,greater<int>> a,c;//定义类型
__gnu_pbds::priority_queue<int> d;//默认大根堆
__gnu_pbds::priority_queue<int>::point_iterator it;//定义指针
struct node
{
int x,y;
bool friend operator <(const node a,const node b)
{
return a.x+a.y<b.x+b.y;
}
};
__gnu_pbds::priority_queue<node> b;
int main()
{
a.push(1),a.push(2),a.push(3);
cout<<a.top()<<"\n";//输出 1
c.join(a);
cout<<a.size()<<"\n";//输出 0
cout<<c.size()<<"\n";//输出 3
cout<<c.top()<<"\n";//输出 1
c.pop();
cout<<c.top()<<"\n";//输出 2
d.push(1),it=d.push(2),d.push(3);
cout<<d.top()<<"\n";//输出 3
d.modify(it,10);
cout<<d.top()<<"\n";//输出 10
b.push({1,1}),b.push({2,2}),b.push({3,3});
cout<<b.top().x<<"\n";//输出 3
}
建议阅读:堆 - OI Wiki
平衡树
#include <ext/pb_ds/assoc_container.hpp>//因为tree定义在这里 所以需要包含这个头文件
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>
Key: 键的类型,示例的类型是int。Mapped: 映射规则(Mapped-Policy)类型:- 如果要指示关联容器是 集合,类似于存储元素在
std::set中,此处填入null_type,低版本g++此处为null_mapped_type; - 如果要指示关联容器是 带值的集合,类似于存储元素在
std::map中,此处填入类似于std::map<Key, Value>的Value类型。
- 如果要指示关联容器是 集合,类似于存储元素在
Cmp_Fn: 关键字比较函数,例如std::less<Key>。Tag: 选择使用何种底层数据结构类型,默认是rb_tree_tag,由于其他两种效率不高,所以这里只解释此类型。Node_Update:用于更新节点的策略,默认使用null_node_update,若要使用kth和rank的函数,需要使用tree_order_statistics_node_update。
成员函数
insert(x):向树中插入一个元素 x,返回std::pair<point_iterator, bool>。erase(x):从树中删除一个元素/迭代器 x,返回一个bool表明是否删除成功。order_of_key(x):返回 x 以Cmp_Fn比较的较小数的个数(求完以后加 1,才是排名)。find_by_order(x):返回Cmp_Fn比较的排名所对应元素的迭代器。lower_bound(x):以Cmp_Fn比较做lower_bound,返回迭代器。upper_bound(x):以Cmp_Fn比较做upper_bound,返回迭代器。join(x):将 x 树并入当前树,前提是两棵树的类型一样,x 树被删除。split(x,b):以Cmp_Fn比较,小于等于 x 的属于当前树,其余的属于 b 树。empty():返回是否为空。size():返回大小。
注意事项
- 使用
null_type的平衡树是不支持重复元素的,如有重复元素插入需要,可以开pair第二位搭配随机数食用。
失效保证(invalidation_guarantee)
pb_ds 提供了三种失效保证(不是所有的容器的有三种),分别是:
basic_invalidation_guarantee - 基本失效保证,最弱的无效保证。可以保证在容器没有修改时候迭代器,指针等保持有效。
Ps:没有修改的情况下,指针所指的元素还是原来的元素。
point_invalidation_guarantee - 点失效保证,更强的无效保证。可以保证在修改容器但迭代器等所指的东西没有被删除是保持有效。
Ps:修改后,如果修改的不是指针所指的元素,那么指针所指的元素还是原来的元素。
range_invalidation_guarantee - 范围失效保证,最强的无效保证。在 点失效保证 的基础上,保证相对位置不变。
Ps:修改后,如果修改的不是指针所指的元素,那么指针所指的元素还是原来的元素;同时,保证指针的相对位置不变。
pairing_heap_tag 均为点失效保证。
rb_tree_tag 为范围失效保证。
其它
ROPE
参考文献
鸽一下……
ext 库及 pb_ds 在 OI 中的应用的更多相关文章
- Cocos2dx 3.x包含ext库报错解决
之前使用cocos2dx 3.6版本中用到了ext库中的一些东西,使用visual studio 2013,编译的时候报错: 无法打开包括文件:“extensions/ExtensionMacros. ...
- GCC&&GDB在OI中的介绍
序言 这本来是用Word写的,但是后来我换了系统所以只能用markdown迁移然后写了...... $\qquad$本文主要投食给那些在Windows下活了很久然后考试时发现需要用命令行来操作时困惑万 ...
- 浅谈分治算法在OI中的应用
分治虽然是基本思想,但是OI中不会出裸分治让你一眼看出来,往往都是结合到找规律里面. 先来个简单的: 奇妙变换 (magic.pas/c/cpp) [问题描述] 为了奖励牛牛同学帮妈妈解决了大写中 ...
- [技术]浅谈OI中矩阵快速幂的用法
前言 矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中,矩阵的运算是数值分析领域的重要问题. 基本介绍 (该部分为入门向,非入门选手可以跳过) 由 m行n列元素排列成的矩形阵列.矩阵里的 ...
- OI中常犯的傻逼错误总结
OI中常犯的傻逼错误总结 问题 解决方案 文件名出错,包括文件夹,程序文件名,输入输出文件名 复制pdf的名字 没有去掉调试信息 调试时在后面加个显眼的标记 数组开小,超过定义大小,maxn/ ...
- prop-types:该第三方库对组件的props中的变量进行类型检测
利用prop-types第三方库对组件的props中的变量进行类型检测
- OI中的莫比乌斯反演
OI中的莫比乌斯反演 莫比乌斯函数 想要学习莫比乌斯反演,首先要学习莫比乌斯函数. 定义 莫比乌斯函数用\(\mu(x)\)表示.如果\(x\)是\(k\)个不同质数的积,则\(\mu(x) = (- ...
- 『Python题库 - 简答题』 Python中的基本概念 (121道)
## 『Python题库 - 简答题』 Python中的基本概念 1. Python和Java.PHP.C.C#.C++等其他语言的对比? 2. 简述解释型和编译型编程语言? 3. 代码中要修改不可变 ...
- 浅谈OI中的提交答案
在OI中,题目有三类: 传统题 交互题 提交答案题 今天来了解一下第三类 概述 传统题:给你一个题面,你需要交一个程序,评测姬会用你的程序运行你看不到的一些测试点,用输出和正确答案比较 提交答案题:给 ...
- OI中组合数的若干求法与CRT
OI中组合数的若干求法与CRT 只是下决心整理一下子呢~ 说明:本篇文章采用\(\binom{a}{b}\)而不是\(C_{a}^b\),以\(p\)指代模数,\(fac_i\)指代\(i!\),\( ...
随机推荐
- js_for循环的错误
本段代码实现的效果是遍历数组中的每个元素,给每个元素插入一个类名 for (var i = 0; i < dropdownLi.length; i++) { if(i == 1){ contin ...
- Win11如何找回熟悉的开始菜单、任务栏和右键菜单
背景 公司政策满3年可以换新电脑,前段时间申请了下,到手后发现是Win11系统,配置翻倍,欣然接受,把一些常用的软件都安装上,但是,用了一段时间后,发现右键刷新要点击2次,开始菜单找东西也完全靠搜索, ...
- 使用 iRingo 解锁本该属于你的苹果服务
为什么别人的 Spotlight 可以通过航班号查询航班信息,而我的不行?为什么别人的 Spotlight 可以直接看英超联赛的比分信息?为什么我的 Apple News 打不开?这其实是因为这些功能 ...
- [Udemy] AWS Certified Data Analytics Specialty - 6.Security
S3 加密 SSE-S3 SSE-KMS SSE-C Client Side Encryption SSL/TLS S3 支持http/https 两种协议 KMS KMS最大能加密4KB的数据,再大 ...
- CIIS 2023 丨聚焦文档图像处理前沿领域,合合信息 AI 助力图像处理与内容安全保障
近日,2023第十二届中国智能产业高峰论坛(CIIS 2023)在江西南昌顺利举行.大会由中国人工智能学会.江西省科学技术厅.南昌市人民政府主办,南昌市科学技术局.中国工程科技发展战略江西研究院承办. ...
- 面试官:GROUP BY和DISTINCT有什么区别?
在 MySQL 中,GROUP BY 和 DISTINCT 都是用来处理查询结果中的重复数据,并且在官方的描述文档中也可以看出:在大多数情况下 DISTINCT 是特殊的 GROUP BY,如下图所示 ...
- SpringMVC —— RESTful入门
RESTful入门案例 1.设定http请求动作(动词) @RequestMapping(value = "/users",method = RequestMethod.POS ...
- Redis 内存突增时,如何定量分析其内存使用情况
背景 最近碰到一个 case,一个 Redis 实例的内存突增,used_memory最大时达到了 78.9G,而该实例的maxmemory配置却只有 16G,最终导致实例中的数据被大量驱逐. 以下是 ...
- [The Trellor] Chapter 1
翻译软件真的翻不好,读英文小说要相信你的脑子. There's only one thing to do in Berlen - that is listening the sound of wind ...
- 数据库故障处理优质文章汇总(含Oracle、MySQL、MogDB等)
数据库告警.紧急问题处理这些项目对于大多数朋友来讲应该不陌生了.从墨天轮社区整理的"最受DBA欢迎的技术文档合辑"系列中可以发现,大家对"故障诊断专题"的热情居 ...