题解 CF276D Little Girl and Maximum XOR

本文提供了CF276D题目详解,主要思路是利用贪心和位运算策略,通过从高位到低位确保二进制位的不同来最大化异或结果。在代码实现中,注意处理细节问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题解 - C F 276 D \mathrm{CF276D} CF276D

题目意思

  • 题目传送门

  • 给你一个区间 [ l , r ] [l,r] [l,r],求 m a x ( a   x o r   b ) , l ≤ a ≤ b ≤ r max(a\ xor\ b) ,l\leq a\leq b\leq r max(a xor b),labr

S o l \mathrm{Sol} Sol

  • 贪心+位运算

  • 我们首先考虑异或的性质,即二进位不同才能产生贡献。

  • 那么我们就有了个很简单的想法就是在保持上下界的情况从高位向低位取(即强制让某些位不同)。

  • 还有的就是细节问题,具体看代码。

C o d e \mathrm{Code} Code

#include <bits/stdc++.h>
#define For(i,a,b) for ( int i=(a);i<=(b);i++ )
#define Dow(i,b,a) for ( int i=(b);i>=(a);i-- )
#define GO(i,x) for ( int i=head[x];i;i=e[i].nex )
#define mem(x,s) memset(x,s,sizeof(x))
#define cpy(x,s) memcpy(x,s,sizeof(x))
#define YES return puts("YES"),0
#define NO return puts("NO"),0
#define GG return puts("0"),0
#define pb push_back
#define int long long 
using namespace std;

inline int read()
{
	int sum=0,ff=1; char ch=getchar();
	while(!isdigit(ch))
	{
		if(ch=='-') ff=-1;
		ch=getchar();
	}
	while(isdigit(ch))
		sum=sum*10+(ch^48),ch=getchar();
	return sum*ff;
}

const int mod=1e9+7;
const int mo=998244353;
const int N=1e5+5;

int a,b,bit[66],Bit[66],ans,all;

signed main()
{
	a=read();
	b=read();
	if(a==b) GG;
	if(a>b) swap(a,b);
	Dow(i,63,0) 
		if((b>>i)&1ll) bit[i]=1;
	Dow(i,63,0) 
		if((a>>i)&1ll) Bit[i]=1; 
	int flg=0,OK=0;
  	//OK保证满足下界,flg保证满足上界
	Dow(i,63,0) 
	{
		if(Bit[i]&&!OK)
		{
			if(all) ans+=(1ll<<i);
			continue;
		}
		if(!bit[i]&&all) 
			ans+=(1ll<<i),OK=1;
		if(bit[i])
		{
			if(!Bit[i]) all=1,ans+=(1ll<<i);
			if(Bit[i]) ans+=(1ll<<i);
		}
	}
	printf("%lld\n",ans);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值