传送门: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 l≥st,r≤ed的区间,则将 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 < 2 30 n,m\leq 150000,a_i< 2^{30} n,m≤150000,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 trxortl−1=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 ed≥i的加值操作更新到数组中。而对于每次区间加 [ l , r ] [l,r] [l,r]的询问,就是查询中 s t ≤ l st\leq l st≤l的 ∑ s t i ≤