ace5 and Task Order

这道题目很像分治,如果将下标序列\([1,n]\)\(a_i\)为关键字排序,排序之后的逆序列就是答案

我们学过的有关分治的排序方法:快速排序和归并排序。这里使用快速排序

这里看官方解答就好了,写的挺清楚的

然后官方解答还给了一个非随机算法,具体来说,就是先从左到右询问每个位置,如果是<,就一直询问直到=;否则的话就询问下一个位置(在询问下一个位置之前,利用上一次=的位置将\(x\)复原)。

这样的话,最后一次<的位置就是\(1\),因为当询问到\(1\)的时候,\(x\)无论为多少,都会<直到=,然后\(x\)就会变成\(1\),之后都是>;由于每次都要复原,所以就能确定\(1\)的位置;同理可以找出\(n\)的位置

然后我们就可以将\(x\)调整为\(\frac{n}{2}\),然后利用随机化算法类似的过程进行快速排序就好了(将小于\(x\)的放左边,大于\(x\)的放右边),此时递归次数就是确定的

update 2024.7.8

重新做这一题目,有了一些突破

首先一个很naive的想法就是对第一个数一直询问直到“=”,对后面的数也是如此,这样的话就可以知道每一个数与最开始的\(x\)的差,于是就可以知道每一个数了(注意这个序列是一个排列);然而这样的询问级别是\(O(n^2)\)的,题目却想要我们询问线性或者log的级别,于是往线性考虑,每一个数只询问一遍,此时我们就要关注整体,整体里面找特殊,特殊元素就是最大的和最小的,我们不难发现上面找最小的过程,找到了\(1\)之后其实已经可以知道所有数了,但是此时询问级别仍然是\(O(n^2)\)的,所以我们再往log的角度想,此时就可以想到分治,分治就要找到中间数,找到中间数就要先找到最大数,于是有了上面的做法

所以主要是看出来\(40\)的提示,以及特殊数的寻找

posted @ 2024-02-21 10:07  最爱丁珰  阅读(2)  评论(0编辑  收藏  举报