联赛前为了填知识点,简单学了一下比较常用的高级数据结构,都没有太深入的理解,于是现在重新搞一遍。
其实有了set和multiset,那么我们就没有再手写平衡树的必要了,所以treap的应用就相对于Splay来说少的多。
Splay主要用于维护序列上的问题,和DFS序等结合可以产生很多种的应用。
这几天刚开始搞的时候比较naive,一上去就搞了个四合一的维护数列,然后慢慢写,慢慢调。
当时写维护数列的时候有一个很大的疑问就是在打标记的时候是否需要updata(reload),因为splay和线段树不一样,存在树形的变换,特别是当很多个标记存在时,标记下传过早或者标记下传不够及时都会出现意想不到的错误。
但是数列相关的题目往往是不需要向上进行updata的,因为我们一般在对一段序列进行魔改的时候要先确定那个区间,然后在树的根节点上打上一个标记。
但是我们在确定区间的限制节点时会自根向下走,这时候该下传的标记就已经下传好了,这是我在写括号序列那道题时才反应过来。
但是为什么维护数列那道题就需要每次修改完就updata呢?因为有区间的插入和删除,这时候根节点siz的大小就会改变,这就会导致确定排名时节点方向选择错误,很容易出现死循环的情况。
还有就是维护数列那道题需要输出一个根节点的信息,同样对于所有操作都需要进行updata。
另外就是DFS序相关的题..那道题到现在还没有调过,具体原因不明,但是再往下调就有点浪费时间了。
DFS序有时候会有更改某个子树的根,刚开始我非常naive的就拿在原树中的siz确定了左右区间,但是在换根的时候原树的siz也会变。
大概就是这些吧..
splay是个非常有用的数据结构,即使恶心也要充分理解,NOI前要再来一波,把那些叉掉的题补回来。