2187B
给定x和y,求使得abs(x-p)+abs(y-q)值最小的一组p和q
对于x和y所有的冲突位,即此位x和y的二进制下都是1,可以分为四种情况
1.保留p=x,q=y+(1<<i),冲突位1给x,给上1位+1
2.保留q=y,p=x+(1<<i)
3.保留p=(x>>i<<i)-1ll,q=y>>i<<i,将x的i位变为0,i位以后全部变为1,y的i位为1,后面为0
4.保留p=x>>i<<i,q=(y>>i<<i)-1ll
都需要判断此时p&q是否等于0

include <bits/stdc++.h>
using namespace std;
define int long long
void solve()
{
int x,y,i,j;
cin >> x >> y;
int a,b;
int ans=4e18;
if((x&y)0)
{
cout << x << " " << y <<endl;
return ;
}
for(i=29;i>=0;i--)
{
if(x&(1ll<<i)&&y&(1ll<<i))
{
int p=(x>>i<<i)+(1ll<<i),q=y;
if((p&q)0&&abs(x-p)+abs(y-q)<ans)
{
ans=abs(x-p)+abs(y-q);
a=p,b=q;
}
p=x,q=(y>>i<<i)+(1ll<<i);
if((p&q)0&&abs(x-p)+abs(y-q)<ans)
{
ans=abs(x-p)+abs(y-q);
a=p,b=q;
}
p=(x>>i<<i)-1ll,q=y>>i<<i;
if((p&q)0&&abs(x-p)+abs(y-q)<ans&&p>= 0)
{
ans=abs(x-p)+abs(y-q);
a=p,b=q;
}
p=x>>i<<i,q=(y>>i<<i)-1ll;
if((p&q)==0&&abs(x-p)+abs(y-q)<ans&&q>=0)
{
ans=abs(x-p)+abs(y-q);
a=p,b=q;
}
}
}
cout << a << " " << b <<endl;
return ;
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int t;
cin >> t;
while (t--)
solve();
return 0;
}
浙公网安备 33010602011771号