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;
}

浙公网安备 33010602011771号