CF1918C XOR-distance 题解
考虑对 进行二进制分解,在二进制位中进行计算。
设 表示数 二进制第 位。如果 ,则不需要对 进行任何构造。但如果 不等于 ,把 置为 只能改变 和 的大小关系,不能使其相等。
所以,我们从高位开始考虑,因为高位影响一定超过低位影响,所以不需要管对低位的影响,计算比较方便。首先找到第一个 与 的大小关系,根据进制位定义,可以推出高位影响一定超过低位影响, 和 的大小关系就已经确定了。接下来,就是在下面的几位中,尽量使较大的数较小,较小的数较大即可,不需要管对低位的影响。
注意在修改时 的值不能超过 。
时间复杂度为 ,可以通过。
#include <bits/stdc++.h>
using namespace std;
long long t,n,m,r,a[200][2];
int main()
{
scanf("%lld",&t);
while(t--)
{
long long flag=-1,ans=0;
scanf("%lld%lld%lld",&n,&m,&r);
for(int i=0;i<=63;i++)
{
if(n&((long long)1<<i))a[i][0]=1;
else a[i][0]=0;
if(m&((long long)1<<i))a[i][1]=1;
else a[i][1]=0;
}
for(int i=63;i>=0;i--)
{
if(a[i][0]==a[i][1])continue;
if(flag==-1)
{
if(a[i][0]>a[i][1])flag=1;
else if(a[i][0]<a[i][1])flag=0;
ans+=((long long)1<<i);
}
else if(a[i][0]>a[i][1])
{
if(flag==1&&r>=((long long)1<<i))r-=((long long)1<<i),ans-=((long long)1<<i);
else if(flag==0)ans-=((long long)1<<i);
else if(flag==1)ans+=((long long)1<<i);
}
else if(a[i][0]<a[i][1])
{
if(flag==0&&r>=((long long)1<<i))r-=((long long)1<<i),ans-=((long long)1<<i);
else if(flag==1)ans-=((long long)1<<i);
else if(flag==0)ans+=((long long)1<<i);
}
}
printf("%lld\n",ans);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探