ace5 and Task Order

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

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

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

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

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

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

update 2024.7.8

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

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

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

posted @   最爱丁珰  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示