C. XOR-distance

原题链接

题解

既然是按位异或,那么我们尝试在二进制视角下考虑问题

我们发现,当两个数的同一位置上都有1的时候,这个1消与不消对结果没有影响,而这个位置上其中一个有一,另一个没有一时,我们可以通过x来转移一
所以在ab俩个数出现第一个10情况不同的位置之后,我们要尽可能地把剩余的一尽可能地移到较小的数
并且高位一加成效果远大于地位一,所以我们贪心移一

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
    ll t;
    cin>>t;
    while(t--)
    {
        ll a,b,r;
        cin>>a>>b>>r;
        ll x=0,i=log2(max(a,b)),len=log2(r);
        for(;i>=1;i--)//找第一个不同10的位置
        {

            if(((a>>i)&1)==1&&((b>>i)&1)==0)//判断一个位置上是一还是零的方法是右移该位置至第0位,然后与1
            {
                for(ll j=min(i-1,len);j>=0;j--)
                {
                    ll dif=(1LL<<j);
                    if(r-dif>=0&&(a&dif)!=0&&(b&dif)==0)
                    {
                        a^=dif;
                        b^=dif;
                        r-=dif;
                    }
                }
                break;
            }
            else if(((a>>i)&1)==0&&((b>>i)&1)==1)
            {
                for(ll j=min(i-1,len);j>=0;j--)
                {
                    ll dif=(1LL<<j);//这里一定要1LL!不然会溢出错误
                    if(r-dif>=0&&(a&dif)==0&&(b&dif)!=0)//对于与的判断是不等于零,因为与的结果实际上是该位置的2的次方!!
                    {
                        a^=dif;
                        b^=dif;
                        r-=dif;
                    }
                }
                break;
            }
        }
        cout<<abs(a-b)<<endl;
    }
    return 0;
}

posted @   纯粹的  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示