题解 | #毒瘤xor#

兔子的区间密码

https://ac.nowcoder.com/acm/problem/20860

不开long long见祖宗,嗯,是这样。

思路很简单,把玩几个样例过后,会发现在二进制下的l和r,只需要关心第一次出现不同的情况。(从高位往低位进发)

我的一些看法:

l:1 1 1...0 an an-1...a1

r: 1 1 1...1 bn bn-1...b1

只考虑l>r,因为l=r时候答案是0。

那么从二进制的高位往低位数,就必然会出现一位二进制位r=1,l=0的时候。

至于前面有多少个1或0我们不在乎,因为他们异或了之后都是0,没有影响。

容易发现an和bn有四种组合方式(1,0),(1,1),(0,0)(0,1)

因为l<r,所以an可以由0->1。反之,bn可以由1->0。

容易发现必然存在组合使得an和bn异或后等于1。

而对于后面的an-1和bn-1可以有同样的操作,甚至后面的数更加宽松,因为当an-1还可能可以由1->0(比如an由0->1)。所以其实an和bn是条件比较苛刻的,而后面的是更宽松的。

所以后面的每一对ai和bi都存在组合使得他们异或等于1。

好了到了这里,我们就只需要找到最高位的二进制不同的位置即可得到答案了。

只需要注意俩个点:位运算优先级的问题和开long long的问题。

代码如下:

#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
ll wei(ll x)//计算r有多少位
{
    int cnt = 0;
    while (x)
    {
        x >>= 1;
        cnt++;
    }
    return cnt;
}
inline ll read()//快读
{
    ll x = 0, f = 1;
    char c = getchar();
    while (c<'0'||c>'9')
    {
        if (c == '-')f = -1;
        c = getchar();
    }
    while ('0'<=c&&c<='9')
    {
        x = (x << 1) + (x << 3) + (c^48);
        c = getchar();
    }
    return x;
}
inline void write(ll x)//快写
{
    if (x < 0)
    {
        putchar('-');
        x = -x;
    }
    if (x > 9)write(x/10);
    putchar(x%10+'0');
}
int main()
{
    ll T; T = read();
    while (T--)
    {
        ll l = read();
        ll r = read();
        if (l == r){printf("0\n"); continue;}//特判相等情况
        ll rr = wei(r);
        int flag = 1,i=1;
        ll ans = 0;
        while (1)
        {
            ll b = r & (1LL << (rr - i));//必须开long long,不然见祖宗
            ll a = l & (1LL << (rr - i));//位运算,无脑括号维护就行。
            if (a!=b)//目的是找到最高位l和r不同的那个地方,也就是二进制下的r=1,l=0时候。即a!=b,因为r>l,所以这样的a和b一定存在。
            {
                ans = (1LL << (rr-i+1))- 1;
                break;
            }
            i++;
        }
        write(ans);
        puts("");
    }



    return 0;
}
全部评论

相关推荐

压力很大,面试官全程高压,问的问题不难,但是没有任何反馈,很慌张,也无算法。实习问了20分钟,一直问我你们做的有什么用,总时长一小时1.学校都有什么课程2.spring的ioc原理以及优点3.除了解耦还知道什么?4.springboot与spring区别,二者的源码看过没?Tomcat了解嘛?有没有具体看过5.spring的bean,面试官一直在重复一个思想问我懂不懂,完全没听过6.mybatis是干什么的?ibatis用过没?平常怎么写SQL?完全不写嘛?7.设计一个分布式双十一秒杀系统(前端,网关,缓存,数据库防超卖全设计)8.怎么做限流9.缓存与数据库一致性,你做异步要用户等你嘛?10.负载均衡怎么做11.多数据中心还是单数据中心,如果出现没卖完怎么做(到这完全不会了,面试官直接说换个话题吧)12.平常读书吗?13.上过哲学课嘛?14.兴趣爱好有没有15.对ai的看法16.来深圳有问题嘛?17.为什么不考研18.上大学带给了你什么?你提升在哪里,有没有具体的例子?反问:1.现在手机都有应用市场,应用宝怎么盈利?除了手机应用市场还是有人用,现在在做跨端,微软都有合作,之后会进军mac,主要做游戏,腾讯本身就是游戏大户。2.面试表现?整体评价一下会给到反馈。面完直接变HR面,今天HR面后,已经转为录用评估了,来牛客许个愿,暑期现在还没什么面试,希望能拿个offer之后再考虑要不要留在手子吧。
nunuking:三面压力这么大吗,面试的会议约了多长时间呀
面试问题记录
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务