将一个有 $n$ 个节点的序列 $\{a_n\}$ 转化为一棵 treap。
-可以依次暴力插入这 $n$ 个节点,每次插入一个权值为 $v$ 的节点时,将整棵 treap 按照权值分裂成权值小于等于 $v$ 的和权值大于 $v$ 的两部分,然后新建一个权值为 $v$ 的节点,将两部分和新节点按从小到大的顺序依次合并,单次插入时间复杂度 $O(\log_2 n)$,总时间复杂度 $O(n\log_2 n)$ 。
+可以依次暴力插入这 $n$ 个节点,每次插入一个权值为 $v$ 的节点时,将整棵 treap 按照权值分裂成权值小于等于 $v$ 的和权值大于 $v$ 的两部分,然后新建一个权值为 $v$ 的节点,将两部分和新节点按从小到大的顺序依次合并,单次插入时间复杂度 $O(\log_2 n)$ ,总时间复杂度 $O(n\log_2 n)$ 。
在某些题目内,可能会有多次插入一段有序序列的操作,这是就需要在 $O(n)$ 的时间复杂度内完成建树操作。
方法三:观察到 treap 是笛卡尔树,利用笛卡尔树的 $O(n)$ 建树方法即可,用单调栈维护右脊柱即可。
-## 将 treap 包装成为 `set<int>`
+## 将 treap 包装成为 `set<int>`
### count 函数