思路很简单,就是简单的贪心,甚至可以改成基础语法。
首先在 l 的基础上试试第一位是 1 会不会超过 r ,不会超过就让他变成 1 ,然后继续第 2 位,第 3 位······
最后把 l 的位数数出来。
核心代码(已经等于AC代码了,所以:)
for(int i=0;i<63;++i)
if((l|(1ll<<i))<=r) l|=/*你猜*/;
for(int i=0;i<63;++i)
if(/*你猜*/) s++;
思路很简单,就是简单的贪心,甚至可以改成基础语法。
首先在 l 的基础上试试第一位是 1 会不会超过 r ,不会超过就让他变成 1 ,然后继续第 2 位,第 3 位······
最后把 l 的位数数出来。
核心代码(已经等于AC代码了,所以:)
for(int i=0;i<63;++i)
if((l|(1ll<<i))<=r) l|=/*你猜*/;
for(int i=0;i<63;++i)
if(/*你猜*/) s++;
其实就是要求 l 到 r 区间内二进制下 1 最多的数。直接将 l 化为二进制,然后从低位到高位枚举,如果将某一位上能改为 1 就直接改,直到超过 r 为止。
这个过程可以用位运算简化,将 l 最低不是 1 的位改为 1 可以使用 l|=l+1
,直接用 while 循环即可。
(手机上不方便打 LaTeX,请见谅)
双倍经验:CF484A
(成功收获两道水绿)
而且这道题曾经是蓝题我想知道洛谷评难度的人在想什么
CF不是交不了吗