fhq treap 理解自用

merge

  • 需要满足左树的所有节点的 val 皆小于右树最小的 val。
  • 会将 key 值较小的节点放在上面,较大的节点放在下面。
  • 运行过程:
    • 首先是下探的过程:我们会把 key 值更小的节点放在更上层,如果左树当前节点的 key 更小,就可以直接向下递归,即将其右子节点置为右子节点与右树当前节点以及它的子树的 merge。
    • 然后是回溯:第一次触碰到边界会发生左/右树的某棵子树接到右/左子树的某个空节点上;然后开始回溯,回溯时若将已回溯的节点集合看作一棵回溯树,那么会发现回溯树的根会在回溯过程中在左树右树之间跳跃,直到回溯到两棵树中最小的那个节点,也就是根节点。注意右树只会往左递归,左树只会往右递归。
  • 除非两棵树开始就为空,不然不可能出现 x y 都为 0 的情况。

split

  • 首先说明如何理解 split 函数中的参数:now 参数是正在遍历到的点;两个引用可以理解为两棵树上待定的点
  • 举个例子:假如我现在的点的 val 小于等于分裂用的 val,那么我做的事情是:首先将当前节点挂到目前 x 树上的待定点,也就是 x = now;由于无法确定右子节点是否小于等于 val,所以将右子节点待定,同时向右遍历,也就是 split(now, val, fhq[now].r, y)

posted on 2025-02-13 18:57  wuhu12345  阅读(8)  评论(0)    收藏  举报

导航