Robotic Sort
题意:给一个数列,用某一特定的方法对其进行排序。其排序方法是,第i次排序时,找到第i小的元素的位置p,输出这个p,并将[i,p]这段区间翻转。进行n次这样的操作后,序列有序。 解题思路:以前用splay写过,思路是抄的别人的。学习treap后,重新再想了一下这个题,想到了一种新的思路。大概是这样的:首先,离散化还是有必要的,因为它会根据原序列里的位置定下其元素的大小。然后对于每次这样的操作,我们要找的必然是最小的那个元素。所以,我们要只需要维护区间的最小值,以及一个翻转标记。那么,我们如何寻找答案呢?显然,我们只要走最小值的值为i的那颗子树就好了,而且必然是能找到的。这样还有一个优点是,我们不需要像以前那种做法那样,从事先记录好的id往上走一遍了,因为我们往下走的时候,会把翻转标记都往下更新,这样,每次我们到达的节点,其信息必然是正确的,而且其子树的最小值信息也是正确的,那么我们就能根据这个最小值信息寻找相应的子树了。 代码:
#include
#include
#include
#include