$Problem’s$ $Website$
$Solution$
这道题是一道平衡树好题,我暂时不会$Splay$,所以就用$fhq-Treap$做。
这道题就要用到排名分裂了。
也就是以排名为对象进行分裂。
对这道题来说,排名就相当于当前这本书上有几本书。
特殊地一点:用一个数组将书的编号映射到树中的编号。
因此,我们还要记录每个节点的父亲节点。
我们来详细解释一下题目中操作的步骤:
1.$Top$ 对$now$和$now - 1$进行分裂,然后将当前的书放到最顶上。
2.$Bottom$ 类似于第一个操作,只不过要把当前的数放到最底下。
3.$Insert$
如果是$0$,那么不需要管。
如果是$1$,就把当前的书和它的前驱交换一下。
如果是$-1$,就把当前的书和它的后驱交换一下。
4.$Ask$ 我们直接查找对应的排名,但注意答案要$-1$,因为树的编号是从$1$开始的。
5.$Query$ 对$x$进行分裂,分裂后左边的数的最右子树的值即为答案。
$P.s.$ 如何使用映射数组找到编号为$x$的书在树中的排名?
$Answer$:我们在确保当前书的编号不为树的根时向上走,如果当前节点是其父节点的右子树,答案就加上左子树的排名$+1$,大家可以
画个图感性理解一下或者运用人类智慧进行理解。
$Code$
1 | //Coded by dy. |
$rp++$