线段树异或

题目大意:输入 n 个数 对这n个数进行区间异或操作,和区间求和操作。
线段树区间合并:
1 - 10
[1 - 5] [6-10]
假设这两个区间,先验证是否可以通过区间修改完成每一个数的异或
1- 10 区间的所有数的和,可以通过 1 - 5 和 6 - 10 和进行合并更新,这一点是没有问题的。
当加入异或操作时,我们需要区间修改,那么涉及到懒标记,假设我们要 1 - 10 区间 每一个数都异或1
那么懒标记会做的事是将懒标记给 1 - 5 和 6 -10 代表的意思是1 - 5 每一个数需要异或 1 同时 6 - 10 每一个数需要异或1
那么 就有
a1 ^ 1 + a2 ^ 1 + a3 ^ 1 + a4 ^ 1 + a5 ^ 1 我们想是否与区间和 ^ 1相等
a6^1 + a7 ^ 1 + a8 ^ 1 + a9 ^ 1 + a10 ^ 1 != (a6 + ……+ a7) ^ 1;
由于 ^ 不满足分配律
这个等式是不成立的,所以说线段树的区间修改出现了问题,就要利用别的方法。
同时还是线段树,只是每一个结点不再存一个 sum 因为无法通过sum 直接更新异或后的值
那么我们就存一个数组,里面存下从 区间 l - r 每一个二进制位 那么再去想区间修改
只需要将x >> i & 1 如果 x是1 那么就说明这个二进制位 ^ 1 1 就会导致反转,0保持不变。
所以我们更新这一位,然而这一位代表从 l - r 所有数 的 第 i 位二进制 数字 和 那么 我们想
如果分别操作,每个数这一位 ^ 1 那么就会导致区间和中的 0 变 1 , 1 变 0 那么我们求出区间长度 - 现在的值
就是 0 的个数,也就是反转后1的个数。这就是区间修改的步骤。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值