早就听说 Splay 就是不管干什么都Splay一下就可以了,但是听说傻可开脑洞打代码打了250行,惊恐。
于是先学treap结果没想到一调试就搞了三个月。但是其实写过treap再学Splay就相对容易一些了。
那就先学只有区间翻转的文艺平衡树。
一开始一直弄不懂它的翻转操作,感觉很迷。但是其实和treap很像,只不过是以翻两下为一组,然后每次Splay把节点旋到指定位置。在三点一线的时候,先旋转x的父亲,再旋转x,除此之外都直接旋转x就好了。
除此之外还要注意一些细节问题。一个是关于添加虚节点的问题。比如我们要翻转[l,r]这个区间,我们可以把r+1这个点Splay到跟,然后把l-1这个点Splay到跟的左儿子,然后直接把l-1的右儿子打上标记。但是如果l==1或r==n,那样就必须添加一个能表示l-1(0)的节点和一个能表示r+1(n+1)的节点。
Splay有两种写法,白书上是没有父亲指针的,但是有父亲指针的适用性更强。