Link
uva太慢了,还是再vjudge上看题目吧。。
FHQ Treap
学习了FHQ Treap的基本操作,以及可持久化Treap的写法。
Merge(a,b)
把a,b合并为一个Treap。前提是a中的所有元素都比b中的小,这样就可以按照可并堆的方法合并了。
Split(pos,K)
将treap分裂成两个,第一个包含了前K个元素,第二个包含剩下的元素。写法和平衡树的查找第K大有些类似。 函数返回一个pair,具体实现比较容易脑补出来。
Build(seq)
把一个序列构建成Treap。 如果是其它的平衡树的话,插入一个序列一般是用递归建立一个完全二叉树。Treap并不能那么做,因为以节点的优先级来确保全局的平衡。 于是Orz Sengxian。 对于一个有序的序列,依次处理每个元素。 维护一个栈,为每个元素新建一个节点,如果新的节点的优先级比栈顶元素小,就退栈,相应地连边。
Persistence
在Merge和Split中,对节点的所有修改都要在副本上进行。每次的花费空间期望应该是级别的。但是由于一次操作可能要多次Split和Merge,导致空间常数大了一些。。如果大神们有又好写又省空间的写法欢迎指教。。。
Code
1 | //Code by Lucida |