【ULR #2】Picks loves segment tree IX

本文介绍了如何解决一个涉及区间更新和异或操作的算法问题。在没有+操作的情况下,通过预处理可以实现O(nlogv)的预处理和O(1)的查询。对于+操作,通过将加法转化为异或操作,并处理进位,构建f和g数组来追踪低位连续0的个数变化,最终使用树链剖分优化算法复杂度。
摘要由CSDN通过智能技术生成

调吐了……

题目描述

太长了,所以就不写了,直接贴链接Picks loves segment tree IX

题解

首先考虑没有 + + +操作时怎么做,没有 + + +操作后每个位相对独立,可以设 p r e i , j pre_{i,j} prei,j表示前 j j j个操作中,对第 i i i位具有赋值效果的最大的操作编号,利用这个就可以规避掉 & ∣ \&| &∣操作,然后直接算区间异或和即可, O ( n log ⁡ v ) O(n\log v) O(nlogv)预处理, O ( 1 ) O(1) O(1)回答询问
对于 + + +操作,一个显然的想法就是把 + + +转化成 xor \text{xor} xor操作来处理,但是进位很不好搞,第 i i i + 1 +1 +1后进位,当且仅当 + + +了之后 0 ∼ i − 1 0\sim i-1 0i1位上都是 0 0 0
通过这个性质把进位的操作都给找出来,想办法把初始操作的 v v v低位连续 0 0 0的个数不断增加

g i , j g_{i,j} gi,j表示一开始时 v v v 0 ∼ i − 1 0\sim i-1 0i1位都是 0 0 0,从 j j j操作开始到 g i , j g_{i,j} gi,j操作, v v v 0 ∼ i 0\sim i 0i位第一次都变为 0 0 0,没有设为 i n f inf inf
我们可以通过这个东西不断地操作使得 v v v的低位连续 0 0 0增加
0 ∼ t − 1 0\sim t-1 0t1位都是 0 0 0以后,我们再设 f i , j f_{i,j} fi,j表示一开始时 v v v 0 ∼ i 0\sim i 0i位都是 0 0 0,从 j j j操作开始到 f i , j f_{i,j} fi,j操作, v v v 0 ∼ i 0\sim i 0i位第一次都变为 0 0 0,没有设为 i n f inf inf,可以通过这个东西再不断地向后移动
f , g f,g f,g可以互推, f 0 , g 0 f_0,g_0 f0,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值