非旋 Treap,是一种好写,常数小,可拓展性强的弱平衡的二叉搜索树。
非旋 Treap 的讲解在其他地方也能找到,这里主要讲她的其他用法,比如——序列操作。
例题 文艺平衡树
我们来试试拿 非旋 Treap 解决 Splay 模板题~
题意
给你一个长度为 $n$ 的序列,初始值为 $(1,2,\cdots,n-1,n)$,你需要执行 $m$ 次操作,每次操作给定一个区间 $[l,r]$,你需要翻转这个区间。举个例子,序列 $(1,2,3,4,5)$ 的 $[2,5]$ 翻转后会变为:$(1,5,4,3,2)$。
$1\leqslant n,m\leqslant 10^5$。
思路
翻转的时候用一种“翻转懒标记”的东西来翻转,标记下传的时候就交换一下左右儿子,每次翻转区间 $[l,r]$ 就将原区间分成 $[1,l)$,$[l,r]$,$(r, n]$ 三部分,然后将中间那部分标记一下,最后 merge 到一起。
时间复杂度期望 $\Theta((n+m)\log n)$,空间复杂度 $\Theta(n)$。
具体细节见代码部分。
代码
1 |
|