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++
Be the first person to leave a comment!