写在前面
来自TRiddle,转载请注明出处,谢谢~
(最后一次更新: 2017/5/3 )
最近我在网上搜题解的时候无意中发现 C++ 中有 pb_ds(Policy-Based Data Structures)这个库(点击这里获取官方文档)。觉得挺新鲜的,就去谷歌去百度了下。然后就发现这个库里有很多好非常玩儿的东西(不是 NBA 里那个库里)。比如可并堆,平衡树和哈希表等等。怀着收获新玩具的喜悦,我赶紧咻咻咻地用它们写了一波题,感觉还是用得蛮舒服的~然而好东西不能光自己用是吧?于是就有了这篇文章。让我们先看看pb_ds中的可并堆吧~
(说明:以下内容在涉及数据结构的地方会用牺牲严谨性来换取更多的通俗性,请见谅^^)
什么是可并堆
(来自TRiddle,转载请注明出处,谢谢~)
首先我觉得有必要介绍一下什么是可并堆。可并堆就是可以合并的堆。在合并后堆中的元素依旧保持原来的“单调性”。(堆就是一个动态集合,能够插入删除其中的元素,同时能够迅速得知集合中最大或最小的元素。若想了解更多跟堆有关的东西,建议直接维基百科~想要了解跟堆的实现有关的东西,建议看《啊哈!算法》或《挑战程序设计竞赛》)
可并堆的题目
为了对可并堆有更加深入的了解,以及方便待会儿讨论可并堆的效率问题,在这里我打算引入一道算法题(HDUOJ 1512,点击这里获取原题)(如果只想了解用法和结论的话可以跳过这个题目,直接看结尾部分):
题目大意
有 N 只富有攻击性的猴子,第
猴子们之间会形成小团体。当猴子 A 和猴子