XOR Construction

题解见这篇文章

b 1 b_1 b1确定的时候,我们如何查询最大值?见最大异或对

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

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

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

写成二进制就是

000
001
111
110
010
011

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

010
011
101
100
000
001

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

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

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

  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值