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,若要使用 kthrank 的函数,需要使用 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

参考文献

堆 - OI Wiki

平衡树 - OI Wiki

浅谈 pb_ds 库及其在 OI/其他算竞中的应用

pbds库学习笔记(优先队列、平衡树、哈希表)

鸽一下……

ext 库及 pb_ds 在 OI 中的应用的更多相关文章

  1. Cocos2dx 3.x包含ext库报错解决

    之前使用cocos2dx 3.6版本中用到了ext库中的一些东西,使用visual studio 2013,编译的时候报错: 无法打开包括文件:“extensions/ExtensionMacros. ...

  2. GCC&&GDB在OI中的介绍

    序言 这本来是用Word写的,但是后来我换了系统所以只能用markdown迁移然后写了...... $\qquad$本文主要投食给那些在Windows下活了很久然后考试时发现需要用命令行来操作时困惑万 ...

  3. 浅谈分治算法在OI中的应用

    分治虽然是基本思想,但是OI中不会出裸分治让你一眼看出来,往往都是结合到找规律里面. 先来个简单的: 奇妙变换 (magic.pas/c/cpp) [问题描述]   为了奖励牛牛同学帮妈妈解决了大写中 ...

  4. [技术]浅谈OI中矩阵快速幂的用法

    前言 矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中,矩阵的运算是数值分析领域的重要问题. 基本介绍 (该部分为入门向,非入门选手可以跳过) 由 m行n列元素排列成的矩形阵列.矩阵里的 ...

  5. OI中常犯的傻逼错误总结

    OI中常犯的傻逼错误总结 问题 解决方案 文件名出错,包括文件夹,程序文件名,输入输出文件名  复制pdf的名字  没有去掉调试信息  调试时在后面加个显眼的标记  数组开小,超过定义大小,maxn/ ...

  6. prop-types:该第三方库对组件的props中的变量进行类型检测

    利用prop-types第三方库对组件的props中的变量进行类型检测

  7. OI中的莫比乌斯反演

    OI中的莫比乌斯反演 莫比乌斯函数 想要学习莫比乌斯反演,首先要学习莫比乌斯函数. 定义 莫比乌斯函数用\(\mu(x)\)表示.如果\(x\)是\(k\)个不同质数的积,则\(\mu(x) = (- ...

  8. 『Python题库 - 简答题』 Python中的基本概念 (121道)

    ## 『Python题库 - 简答题』 Python中的基本概念 1. Python和Java.PHP.C.C#.C++等其他语言的对比? 2. 简述解释型和编译型编程语言? 3. 代码中要修改不可变 ...

  9. 浅谈OI中的提交答案

    在OI中,题目有三类: 传统题 交互题 提交答案题 今天来了解一下第三类 概述 传统题:给你一个题面,你需要交一个程序,评测姬会用你的程序运行你看不到的一些测试点,用输出和正确答案比较 提交答案题:给 ...

  10. OI中组合数的若干求法与CRT

    OI中组合数的若干求法与CRT 只是下决心整理一下子呢~ 说明:本篇文章采用\(\binom{a}{b}\)而不是\(C_{a}^b\),以\(p\)指代模数,\(fac_i\)指代\(i!\),\( ...

随机推荐

  1. 题解:SP22382 ETFD - Euler Totient Function Depth

    题目链接: link,点击这里喵. 前置知识: [模板]线性筛素数,欧拉函数,点击这里喵. 题意简述: 给定整数 $l,r,k$,求出 $[l,r]$ 中有多少个整数不断对自己取欧拉函数刚好 $k$ ...

  2. Vue 项目 毒鸡汤 壮士可要来一碗!

    项目灵感来自"聆听远方"的毒鸡汤 非常简单 适合 Vue 新童鞋 按国际惯例 先上图 来不及解释了 快把代码复制走 poison-soup.html <!DOCTYPE ht ...

  3. Redis解读(3):Redis分布式锁、消息队列、操作位图进阶应用

    Redis 做分布式锁 分布式锁也算是 Redis 比较常见的使用场景 问题场景: 例如一个简单的用户操作,一个线城去修改用户的状态,首先从数据库中读出用户的状态,然后 在内存中进行修改,修改完成后, ...

  4. 国产化适配——人大金仓V8R6(1)

    本文主要记录kingbase安装及存储过程修改相关内容,或有错漏,请指正. 原数据库:Mysql8.0.31 现数据库:KingbaseES V008R006C008M001B0030 on x86_ ...

  5. Round #2022/12/03

    问题 B: 约数个数 题目描述 有 \(t\) 次询问,每次给你一个数 \(n\) ,求在 \([1,n]\) 内约数个数最多的数的约数个数. 输入 第一行一个正整数 \(t\) . 之后 \(t\) ...

  6. vue 消息订阅与发布

    vue 消息订阅与发布 一.场景 vue中非父子组件之间通信时,使用vuex有时间会很麻烦,这时候可以通过bus总线来实现 消息的订阅与发布 二.实现方法 1.main.js //main.js Vu ...

  7. Angular 18+ 高级教程 – Angular CLI

    前言 这篇会列出我开发中常用的 command. 并给予一些简单的说明 Command Format 先了解一下几个简单的 command 格式: 缩写 shortform 这个是完整版 ng gen ...

  8. CSS – BEM (Block__Element--Modifier)

    前言 BEM 是一种 CSS class 命名规范. 目的是防止大家名字取太短, 不小撞名字后果很麻烦. 参考: Youtube – You Probably Need BEM CSS in Your ...

  9. JDBC——案例

    创建一个商品表 drop table if exists tb_brand; -- 创建tb_brand表 create table tb_brand( id int primary key auto ...

  10. QT6 QML编程

    QT6 QML编程 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C++扩展开发视频课程 免费QT视频课程 您可以看免费1000+个QT技 ...