树状数组

一维:区间修改 区间查询

设原序列 {ai}\{a_i\} 的差分序列为 {di}\{d_i\}(即 di={ai−ai−1i≥2a1i=1d_i=\begin{cases}a_i-a_{i-1}&i\ge2\\a_1&i=1\end{cases})。

∑i=1nai=∑i=1n∑j=1idj=∑i=1ndi×(n−i+1)=(n+1)×∑i=1ndi −∑i=1ni×di\begin{aligned} \sum\limits_{i=1}^na_i&=\sum_{i=1}^n\sum_{j=1}^id_j\\ &=\sum_{i=1}^nd_i\times(n-i+1)\\ &=(n+1)\times\sum_{i=1}^nd_i~-\sum_{i=1}^ni\times d_i \end{aligned}

因此,除了维护差分序列 {di}\{d_i\} 本身的前缀和外,还需维护序列 {i×di}\{i\times d_i\} 的前缀和。

  • 区间查询:如上。
  • 区间修改:序列 1 第 ll 位加上 Δx\Delta x、第 r+1r+1 位减去 Δx\Delta x;序列 2 第 ll 位加上 l×Δxl\times\Delta x、第 r+1r+1 位减去 (r+1)×Δx(r+1)\times\Delta x。

二维:区间修改 区间查询

定义差分数组 di,j=ai,j−ai−1,j−ai,j−1+ai−1,j−1d_{i,j}=a_{i,j}-a_{i-1,j}-a_{i,j-1}+a_{i-1,j-1}。则 ai,j=∑h=1i∑k=1jdh,ka_{i,j}=\sum\limits_{h=1}^i\sum\limits_{k=1}^jd_{h,k}。

∑i=1x∑j=1yai,j=∑i=1x∑j=1y∑h=1i∑k=1jdh,k=∑i=1x∑j=1ydi,j×(x−i+1)×(y−j+1)=(x+1)(y+1)∑i=1x∑j=1ydi,j−(y+1)×∑i=1x∑j=1yi×di,j−(x+1)×∑i=1x∑j=1yj×di,j+∑i=1x∑j=1yi×j×di,j\begin{aligned} \sum_{i=1}^x\sum_{j=1}^ya_{i,j}&=\sum_{i=1}^x\sum_{j=1}^y\sum_{h=1}^i\sum_{k=1}^jd_{h,k}\\ &=\sum_{i=1}^x\sum_{j=1}^yd_{i,j}\times(x-i+1)\times(y-j+1)\\ &=(x+1)(y+1)\sum_{i=1}^x\sum_{j=1}^yd_{i,j}-(y+1)\times\sum_{i=1}^x\sum_{j=1}^yi\times d_{i,j}-(x+1)\times\sum_{i=1}^x\sum_{j=1}^yj\times d_{i,j}+\sum_{i=1}^x\sum_{j=1}^yi\times j\times d_{i,j} \end{aligned}


莫队

普通莫队

设块大小为 O(B)O(B),ll 的总移动为 O(Bm)O(Bm),rr 的总移动为 O(nB⋅n)O(\frac nB\cdot n),总共为 O(Bm+n2BO(Bm+\frac{n^2}B。由均值不等式得块长在 B∈O(nm)B\in O(\frac n{\sqrt m}) 时取得最小值,总复杂度 O(nm)O(n\sqrt m)。

常数优化:

  • 奇偶交错升降。
  • 块大小可尝试 n23m\frac n{\sqrt{\frac 23m}}。

带修莫队

第一关键字 LL 按所在块排序,第二关键字 RR 按所在块排序,第三关键字按时间排序。当块长 B∈O(n23)B\in O(n^{\frac23})(假设 n=mn=m)时,总复杂度 O(n53)O(n^{\frac53})。