XOR Construction

题解见这篇文章

\(b_1\)确定的时候,我们如何查询最大值?见最大异或对

当然,也有另一种思路,就是按位考虑

一样的,我们通过模拟位,可以知道\(b_i\)(\(i≥2\))与\(b_1\)的每一位的异同,所以我们确定了\(b_1\)就确定了所有\(b_i\),然而我们却不能确定\(b_1\),我们也没办法枚举\(b_1\),不然时间复杂度太大了

这个时候我们尝试一下样例。我们直接令\(b_1=0\),然后跑样例,跑出来的\(6\)个数是0 1 7 6 2 3

写成二进制就是

000
001
111
110
010
011

我们来看看样例输出给的每个二进制

010
011
101
100
000
001

观察两组数的不同,发现在每一位上有可能\(0\)\(1\)互换(原来是\(0\)的地方全变成了\(1\),原来是\(1\)的地方全变成了\(0\))

我们又想到,题目最终要求的是\([0,n-1]\),所以每一位的\(0\)\(1\)的总个数是确定的

那么如果我们最开始求出来的这组数在某一位上的\(1\)的个数与最终的\(1\)的个数不同,那么我们直接将\(0\)的地方全变成\(1\)\(1\)的地方全变成\(0\)就好了;如果相同的话,这个时候变不变是没有影响的,因为就相当于原来的某两个数交换了一下位置(比如原来第\(2\)个数是\(010\),第\(5\)个数是\(000\),然后我们现在把从右往左第二位取反,那么取反之后就是第\(2\)个数变成了\(000\),第\(5\)个数变成了\(010\)),显然不影响答案

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值