zoukankan      html  css  js  c++  java
  • [CF Contest] Guessing the Greatest 题解

    值得一想的题。对于整个序列,我们发现一开始根本无法下手,只能询问整个序列,得到一个答案 (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 类型的函数会比较好写。

  • 相关阅读:
    数据--第53课
    数据--第52课
    数据--第51课
    标准模板库中的优先队列(priority_queue)
    进程的定义
    进程的基本概念
    循环不变式
    插入排序
    模板声明
    标准模板库中的队列(queue)
  • 原文地址:https://www.cnblogs.com/Inversentropir-36/p/14452912.html
Copyright © 2011-2022 走看看