Treap?Treap?Treap!

旋转treap:

key为给定值 满足二叉树性质

weight为随机值 满足堆性质

没有双旋 只有单旋

而且要分别写左旋和右旋

insert之后一定要旋转 不然会不满足Treap性质

区间翻转之类的好像做不到 对于区间类问题似乎都比较弱(。・・)ノ

那么我为什么还要去看这玩意儿呢

不仅是因为非旋Treap可持久化的问题

还因为在写树套树的时候

我发现写splay是经常需要查前驱后继的对不对

包括删除/直接查询

按照我们平常的习惯 为了避免re我们还需要在每一棵树插一个inf和一个-inf

然而的树套树的时候我觉得这么插入实在是有点无趣了


刚好又早仰能可持久化的非旋treap大名

就刚好在2017的last day学一下好了


感觉好厉害 而且还资瓷处理区间啊

然后我一开始看到merge需要A树所有节点的key小于b树最小节点才能操作的时候是懵逼的

而且当我看到不满足这个条件就会需要启发式合并是更懵逼的

结果

我思考了一会儿

突然发现 好像经常性的操作是split之后再merge的

然后我们split操作是按key值把树剖开的 所以经常性的是能满足上面情况的

在满足这一情况之后我们就可以类似于左偏树一样的递归合并啦(比较的是weight值)

这玩意儿

真的

太好写了吧!

而且

好有逻辑!

我爱它!!!!


评论
© Utopia|Powered by LOFTER