首先考虑,若我们知道一个数,我们如何知道其他数是1还是0

假设已知 \(a\) ,对于 \(b\leq c\) 可知:

\(a\leq b+c\) 则有 \(a\leq c\) (否则 \(a=0,c=1\) 不满足条件)

\(a\geq b+c\) 则有 \(b=0\) (否则 \(b+c=2\)

现在我们考虑如何知道一个数。显然,虽然相同时返回的结果很随机,但 \(1\) 一定比 \(0\) 大于更多的数。

也就是说,通过 \(2n\) 次比较,可知一个 \(1\) 的位置。

然后将这个 \(1\) 与其他位置比较即可。(最后一个数无法成对,但通过奇偶性可知)

这样次数是 \(2n+5n=7n\) 无法通过。

考虑优化 \(5n\) 不太可行。于是着手 \(2n\) 。可否不找出最大值呢?

发现上述条件中有些没有用到,因为 \(a\) 一直都是1 。如果 \(a\) 不一定是1 ,我们考虑上述第二条是可以直接求出 \(b\) 的,第一条得知 \(a\leq c\) 有什么用呢?

发现这和我们之前求最大值有点像,因为 \(c\) 就是 \(a,b,c\) 中最大的值了。

这样如果做完整个数列,我们就知道整个数列最大的值了。

现在除了某些0和最大值我们一无所知,不过我们知道剩余所有数的大小关系。为了方便描述,我们将他排成一条链。

发现这样和 Subtask 3 相同,也就是:

二分中点 mid,以其为 \(c\) ,比其小的(设位置为 mid-1 )为 \(b\)

通过比较可知这两个位置的数。于是可以求出0,1的交界点。

注意到二分到某个数的时候无法确定,于是再次用奇偶性判断。

原文地址:http://www.cnblogs.com/gyyyyy/p/16866811.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性