[洛谷日报第39期]比STL还STL?——pbds

 

洛谷科技

发布时间:18-08-3116:37

__gnu_pbds食用教程

引入

某P党:“你们C++的STL库真强(e)大(xin),好多数据结构和算法都不用手打。”

C党1:“STL能省下的代码量又不多,平衡树多难调啊。”

C党2:“欸?__gnu_pbds库就可以做到啊,它封装了hash,tree,trie,priority_queue这四种数据结构。”

正文

介绍

什么是__gnu_pbds ? Policy based data structures!简称平板电视pbds。在使用pbds前,你需要

woc,真jb烦,有没有什么简单的方法?当然有:

但是在dev c++里如果这样写,会提示少一个文件,出各种莫名奇妙的锅,其它的IDE请自行尝试,我的linux是deepin的,装了NOI Linux的dalao帮忙测一下。

hash

该引用的头文件和命名空间都讲过了,直接进入正题。

hash_table的用法与map类似,它是这么定义的:

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

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

等一等?和map一样,那不如直接用map了。不不不,map的总时间复杂度是 O(nlogn) 的,而hash_table的总时间复杂度仅为 O(n) !所以我们可以用这个特性来做洛谷P1333 瑞瑞的木棍(https://www.luogu.org/problemnew/show/P1333)。前置知识:并查集(https://www.luogu.org/blog/41785/jian-yi-bing-zha-ji)欧拉路(https://www.luogu.org/blog/lzhbigbird/zong-qi-qiao-wen-ti-dao-ou-la-lu)。

感谢Great_Influence的代码:

tree

pbds里面的tree都是平衡树,其中有rb_tree,splay_tree,ov_tree(后两种都容易超时,所以请不要用它们)。需要的头文件与命名空间也讲了,下面我们来看它的食用方法:

下面我们来试一试洛谷P3369 普通平衡树(https://www.luogu.org/problemnew/show/P3369)(感谢shenben的代码):

前方高能!前方高能!前方高能!

在看这里之前,你需要熟练地掌握c++的特性。如果看不懂我也没有办法,你可以跳过这一部分。

你以为pbds种的tree只能实现这些功能?不不不,你可以自定义它,我们需要写一个自己的node_update,它是长这样的:

我们先解释一下这个类是如何工作的。节点更新的tree都会保存一个my_type类型的变量。当我们修改这棵树的时候,会从叶子节点开始修改,并且每次都会调用operator(),我们来看一下这个函数的两个参数:

Node_Itr it为调用该函数的元素的迭代器,Node_CItr end_it可以const到叶子节点的迭代器,Node_Itr有以下的操作:

1.get_l_child(),返回其左孩子的迭代器,没有则返回node_end;

2.get_r_child(),同get_l_child();

3.get_metadata(),返回其在树中维护的数据;

4.it可以获取it的信息。

为了详细讲解,我们举一个更新子树大小的例子:

现在我们学会了更新,那么我们该如何自己写操作呢?node_update所有public方法都会在树中公开。如果我们在node_update中将它们声明为virtual,则可以访问基类中的所有virtual。所以,我们在类里添加以下内容:

这样我们就能直接访问树了,还有,node_begin指向树根,node_end指向最后一个叶子节点的后一个地址,下面这个就是查排名的操作:

下面我们来看CF459D(https://www.luogu.org/problemnew/show/CF459D):

trie

trie即为字典树,我们先看如何定义一个trie与它的操作:

现在我们来看Astronomical Database(http://acm.timus.ru/problem.aspx?space=1&num=1414):

priority_queue

priority_queue为优先队列,用堆实现,priority_queue的定义与操作:

时间复杂度:

堆优化dijkstra(https://www.luogu.org/problemnew/show/P4779)(感谢Great_Influence的代码):

关于rope

sorry,rope属于__gnu_cxx,不属于__gnu_pbds。下次讲ext中其他的内容时,我会讲rope。

最后

NOIP中可以使用pbds!

完结撒花!★,°:.☆( ̄▽ ̄)/ :.°★ 。

本文发布于洛谷日报,特约作者:Chanis

原文地址:https://www.luogu.org/blog/Chanis/gnu-pbds

 

[洛谷日报第39期]比STL还STL?——pbds的更多相关文章

  1. [洛谷日报第62期]Splay简易教程 (转载)

    本文发布于洛谷日报,特约作者:tiger0132 原地址 分割线下为copy的内容 [洛谷日报第62期]Splay简易教程 洛谷科技 18-10-0223:31 简介 二叉排序树(Binary Sor ...

  2. [洛谷日报#204] StackEdit——Markdown 编辑器的功能介绍

    本文同时发表于洛谷日报,您也可以通过洛谷博客进行查看. 1.介绍与开始使用 1.1 这是什么? StackEdit是基于PageDown.Stack Overflow和其他堆栈交换站点使用的Markd ...

  3. 【洛谷日报#26】GCC自带位运算系列函数

    文章转自 洛谷 谈到GCC的黑科技,大家想到的一定是这句: #pragma GCC optimize (3)//吸氧 抑或是这句: #pragma GCC diagnostic error " ...

  4. 洛谷日报 & 原来博客(转载)

    震惊,新的功能:可以按Ctrl + F 进行关键字查询. \(update\) on 10.26:把这两个月的日报也加入进去了,并且修复了几个错误. 本文会把小编用过的博客和比较好的博客放在这里. 可 ...

  5. 洛谷P1118 数字三角形【dfs】【STL】

    题目链接:https://www.luogu.org/problemnew/show/P1118 题意: 1~n的一个排列,相邻的两项加起来得到下一行. 现在给定最后一行的数字,问最初的1~n的排列是 ...

  6. 【洛谷日报#75】浅谈C++指针

    放入我的博客食用效果更佳(有很多oi学习资料) 1.指针基础 1.引用 C++有一个东西叫引用,引用相当于给对象(如:变量)起了另一个名字,引用必须用对象初始化,一旦初始化,引用就会和初始化其的对象绑 ...

  7. CodeForces 79D 【Password】,洛谷P3943 【星空】

    其实我做的是洛谷的P3943,但是听说fstqwq窃题...... 题目描述: 小 C 拿来了一长串星型小灯泡,假装是星星,递给小 F,想让小 F 开心一点.不过,有 着强迫症的小 F 发现,这串一共 ...

  8. BZOJ 3545 / 洛谷 P4197 Peaks 解题报告

    P4197 Peaks 题目描述 在\(\text{Bytemountains}\)有\(N\)座山峰,每座山峰有他的高度\(h_i\).有些山峰之间有双向道路相连,共\(M\)条路径,每条路径有一个 ...

  9. 洛谷U41492(树上启发式合并)

    提交通道 洛谷日报 考虑非\(O(n^2)\)的预处理.一遍dfs时,check某颜色有没有的数组何时清空很尴尬:得到某树答案后如果不清,则影响接下来兄弟树的搜索:如果清了,父亲节点又难以收集答案. ...

随机推荐

  1. 本地项目上传到github上最直接步骤

    1.首先得有一个git账号(本地安装git) 2.git上创建一个project 3.回到本地你要提交文件夹位置 4.按住shift + 鼠标右键 选择在此处打开命令窗口 5.输入命令  git in ...

  2. Redis学习总结(六)--Redis集群伸缩

    我们在上一章讲了如何创建集群,今天我们来实现下集群的伸缩. 添加节点 操作流程 1.启动节点 2.将节点加入到集群中 3.将数据槽从原来的节点迁移部分到新节点上 实践 1)准备两个新节点并启动 [ro ...

  3. Flink中Periodic水印和Punctuated水印实现原理(源码分析)

    在用户代码中,我们设置生成水印和事件时间的方法assignTimestampsAndWatermarks()中这里有个方法的重载 我们传入的对象分为两种 AssignerWithPunctuatedW ...

  4. jQuery事件以及动画

    jQuery事件以及动画 一.jQuery事件 加载DOM 在页面加载完毕后, 浏览器会通过 JavaScript 为 DOM 元素添加事件. 在常规的 JavaScript 代码中, 通常使用 wi ...

  5. (数据科学学习手札67)使用Git管理Github仓库

    一.简介 Git是目前使用最广泛的分布式版本控制系统,通过Git可以方便高效地管理掌握工作过程中项目内容文件的更新变化情况,通过Git我们可以以命令行的形式完成对Github上开源仓库的clone,以 ...

  6. NLP(二十四)使用LSTM构建生成式聊天机器人

    准备 数据集:AIML数据集 下载数据集并用Notepad++打开,复制到txt文件中方便打开 代码实现 数据很少,训练轮次不多,结果不好,仅当示例 import numpy as np import ...

  7. Luogu-P2512 [HAOI2008]糖果传递 贪心

    传送门:https://www.luogu.org/problemnew/show/P2512 题意: 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1 ...

  8. codeforces 820 C. Mister B and Boring Game(找规律)

    题目链接:http://codeforces.com/contest/820/problem/C 题解:显然a<=b的规律很好找只要 例如a=2,b=5,只要这样排列就行abbbbbbabbbb ...

  9. ~!#$%^&*这些符号怎么读? 当然是用英语(键盘特殊符号小结)

    ~!#$%^&*这些符号怎么读? 当然是用英语(键盘特殊符号小结)   感谢原文作者:http://www.360doc.com/content/14/0105/20/85007_342874 ...

  10. C#开发BIMFACE系列22 服务端API之获取模型数据7:获取多个模型的楼层信息

    系列目录     [已更新最新开发文章,点击查看详细] 在<C#开发BIMFACE系列21 服务端API之获取模型数据6:获取单模型的楼层信息>中介绍获取单个模型的所有楼层信息.某些场景下 ...