【BZOJ】5220: [Lydsy2017省队十连测]异或与区间加 多重分块&分类讨论

传送门:bzoj5220


题意

给定长度为 n n n的数组 a a a中不超过 n 2 n^2 n2个区间(以 l , r l,r l,r满足异或和为 k k k的形式给出),再给定初始值均为 0 0 0的长度为 n n n的数组 b b b m m m ( s t , e d , w ) (st,ed,w) (st,ed,w)的加值操作,具体操作为:遍历所有给定的区间,若满足 l ≥ s t , r ≤ e d l\geq st,r\leq ed lst,red的区间,则将 b l , b l + 1 , . . . , b r b_l,b_{l+1},...,b_r bl,bl+1,...,br全部加上 w w w
求操作完毕后的 b b b数组。

n , m ≤ 150000 , a i &lt; 2 30 n,m\leq 150000,a_i&lt; 2^{30} n,m150000,ai<230


题解

这道题真的是将分块&分类讨论进行到底啊。不仅操作分块,赋值也要分情况讨论,最终将复杂度优化到 O ( ( n + m ) n ) O((n+m)\sqrt n) O((n+m)n )。膜了膜 C l a r i s Claris Claris的题解,终于码出来了。

发现网上没什么题解,下面具体讲一下探索解法的过程:

首先考虑如何快速处理出所有满足 a l x o r a l + 1 . . . x o r a r = k a_l xora_{l+1}...xora_r=k alxoral+1...xorar=k的区间。设 t i = a 1 x o r a 2 . . . x o r a i t_i=a_1xora_2...xora_i ti=a1xora2...xorai,条件转化为 t r x o r t l − 1 = k t_rxort_{l-1}=k trxortl1=k,逐个加入 t i t_i ti,存在 m a p map map里,就可以 n l o g n nlogn nlogn处理出来了,记得记录每个位置对应的 k x o r t i kxor{t_i} kxorti的个数(之后的分类讨论会用到)。

发现这样区间数目最坏情况下多达 n 2 n^2 n2级别(如全为 k k k的情况)。而加值操作固定为 m m m次。那么考虑牺牲加值操作的复杂度,使得 b b b数组的区间加操作复杂度变为 O ( 1 ) O(1) O(1)

可以将加值操作按 e d ed ed降序排序,倒序遍历 r = i r=i r=i的区间,每次将 e d ≥ i ed\geq i edi的加值操作更新到数组中。而对于每次区间加 [ l , r ] [l,r] [l,r]的询问,就是查询中 s t ≤ l st\leq l stl ∑ s t i ≤

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值