值得一想的题。对于整个序列,我们发现一开始根本无法下手,只能询问整个序列,得到一个答案 (x) 。
现在在 (x) 的左边尝试询问即 ([1,x])。假如次大值还是 (x) ,那么易证最大值就在区间 ([1,x-1]) 里(即 ( ext{ans}<x));假如次大值不是 (x) ,那么最大值就在 ([x+ 1,n]) 里(即 ( ext{ans}>x))。
我们先定义一个函数 (f(a,b)) 返回的是区间 ([a,b]) 的次大值。
考虑二分最大值。若 (f( ext{mid},x)=x),那 ( ext{ans}> ext{mid}) 。然后再在可能出现 ( ext{ans}) 的地方二分。另一种情况也差不多,读者可以自行推导。
这题对我来说比较难写,所以建议把代码模块化一下, (f(a,b)) 单独封装成一个 int
类型的函数会比较好写。