[洛谷日报第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

 

最新文章

  1. 使用C#设计Fluent Interface
  2. linux重新设定分区大小
  3. idea首次提交项目
  4. Xcode中的几个常用文件路径
  5. TCP同步传送数据示例(简洁、清楚)
  6. es增量自定义更新的脚本
  7. 调用系统api修改系统时间
  8. jQuery常用事件详解
  9. javascript 要注意的事项
  10. InheritableThreadLocal
  11. OC--设置视图控制器,从导航栏的下边缘开始
  12. Google HTML/CSS 编码规范
  13. require include 一个隐藏的用法:作用域。
  14. 程序员之路:python3+PyQt5+pycharm桌面GUI开发
  15. JDK源码分析(12)之 ConcurrentHashMap 详解
  16. 洛谷P4175 网络管理
  17. Java编程的逻辑 (86) - 动态代理
  18. cf 557D 二分图黑白染色
  19. SCOI2019 游记
  20. 进程控制函数(2)-setpgid() 修改当前进程的进程组ID

热门文章

  1. 【翻译】无需安装Python,就可以在.NET里调用Python库
  2. python 05 字典
  3. hibernate 报错com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException
  4. JavaScript Array 数组方法汇总
  5. HTML 事件属性(摘自菜鸟教程)
  6. spring-cloud-kubernetes与SpringCloud Gateway
  7. Codeforces 964C Alternating Sum
  8. 【Offer】[27]【二叉树的镜像】
  9. Spring Boot2 系列教程(四)理解Spring Boot 配置文件 application.properties
  10. Spring Security Oauth2 自定义 OAuth2 Exception