[CF Contest] Guessing the Greatest 题解

值得一想的题。对于整个序列,我们发现一开始根本无法下手,只能询问整个序列,得到一个答案 \(x\)

现在在 \(x\) 的左边尝试询问即 \([1,x]\)。假如次大值还是 \(x\) ,那么易证最大值就在区间 \([1,x-1]\) 里(即 \(\text{ans}<x\));假如次大值不是 \(x\) ,那么最大值就在 \([x+ 1,n]\) 里(即 \(\text{ans}>x\))。

我们先定义一个函数 \(f(a,b)\) 返回的是区间 \([a,b]\) 的次大值。

考虑二分最大值。若 \(f(\text{mid},x)=x\),那 \(\text{ans}>\text{mid}\) 。然后再在可能出现 \(\text{ans}\) 的地方二分。另一种情况也差不多,读者可以自行推导。

这题对我来说比较难写,所以建议把代码模块化一下, \(f(a,b)\) 单独封装成一个 int 类型的函数会比较好写。

posted @ 2021-02-26 16:19  Inversentropir-36  阅读(49)  评论(0编辑  收藏  举报