牛客小白月赛T3总结

不要害怕错误的尝试,有的时候这是你找到正解的一部分。

题面 对于任意一个非负整数w,若存在两个非负整数x,y(可以相同),使得: $$w = 2^x + 2^y$$

则称w为一个可合数
现在给定两个非负整数L,R,请你求出区间 [L, R] 内有多少个不同的可合数
($L < R < 2^{63} $)

看到题目的第一反应是畏难,这是绝对不可取的,这也是现阶段我需要解决的重要心理因素

一开始,我看着公式没有思路,害怕于\(2^{63}\)的数据量,这意味着不能去在一个区间内一个一个找。

渐渐的,我明确了目标,题目是让我求有多少个不同的可合数,枚举x, y可以找出所有的情况,情况总数也不过63*63,于是就可以预处理所有的可合数

我本以为到此结束,但没有意识到T很大,估算错了常数乘积(我以为63*63是百级别,虽然这样也不一定过),复杂度超标。

我的预处理并不透彻,但是我寻思如何优化的时候意外想到了正解。
在预处理后的未排序数组,我想看到一个大于L的数字就结束,但是发现结果和暴力代码不一样。

于是我发现需要给数组排序,但是打断的方式不能直接改变的复杂度,但是排序却让我想到了二分

在单调递增的区间中,二分出L,R的下标,再将其相减不就可以了?(有一点问题,后面会讲)

于是我写出了代码,两个都用了lower_bound()查找,于是50pts

哪里错了?(即使+1也没用哦,不过可以特判)

第二个要用upper_bound()因为,两端点可能刚好就是可合数,也有可能不是,upper_bound()会找到第一个大于R的下标,前一个下标当然就是小于等于的,这样就可以直接两下标相减了

总结

不要害怕错误的尝试,有的时候这是你找到正解的一部分。

posted @ 2026-05-08 22:47  PCMSFV  阅读(4)  评论(0)    收藏  举报