树状数组
一维:区间修改 区间查询
设原序列 {ai} 的差分序列为 {di}(即 di={ai−ai−1a1i≥2i=1)。
i=1∑nai=i=1∑nj=1∑idj=i=1∑ndi×(n−i+1)=(n+1)×i=1∑ndi −i=1∑ni×di
因此,除了维护差分序列 {di} 本身的前缀和外,还需维护序列 {i×di} 的前缀和。
- 区间查询:如上。
- 区间修改:序列 1 第 l 位加上 Δx、第 r+1 位减去 Δx;序列 2 第 l 位加上 l×Δx、第 r+1 位减去 (r+1)×Δx。
二维:区间修改 区间查询
定义差分数组 di,j=ai,j−ai−1,j−ai,j−1+ai−1,j−1。则 ai,j=h=1∑ik=1∑jdh,k。
i=1∑xj=1∑yai,j=i=1∑xj=1∑yh=1∑ik=1∑jdh,k=i=1∑xj=1∑ydi,j×(x−i+1)×(y−j+1)=(x+1)(y+1)i=1∑xj=1∑ydi,j−(y+1)×i=1∑xj=1∑yi×di,j−(x+1)×i=1∑xj=1∑yj×di,j+i=1∑xj=1∑yi×j×di,j
莫队
普通莫队
设块大小为 O(B),l 的总移动为 O(Bm),r 的总移动为 O(Bn⋅n),总共为 O(Bm+Bn2。由均值不等式得块长在 B∈O(mn) 时取得最小值,总复杂度 O(nm)。
常数优化:
- 奇偶交错升降。
- 块大小可尝试 32mn。
带修莫队
第一关键字 L 按所在块排序,第二关键字 R 按所在块排序,第三关键字按时间排序。当块长 B∈O(n32)(假设 n=m)时,总复杂度 O(n35)。