树状数组

一维:区间修改 区间查询

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

i=1nai=i=1nj=1idj=i=1ndi×(ni+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,jai1,jai,j1+ai1,j1d_{i,j}=a_{i,j}-a_{i-1,j}-a_{i,j-1}+a_{i-1,j-1}。则 ai,j=h=1ik=1jdh,ka_{i,j}=\sum\limits_{h=1}^i\sum\limits_{k=1}^jd_{h,k}

i=1xj=1yai,j=i=1xj=1yh=1ik=1jdh,k=i=1xj=1ydi,j×(xi+1)×(yj+1)=(x+1)(y+1)i=1xj=1ydi,j(y+1)×i=1xj=1yi×di,j(x+1)×i=1xj=1yj×di,j+i=1xj=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(nBn)O(\frac nB\cdot n),总共为 O(Bm+n2BO(Bm+\frac{n^2}B。由均值不等式得块长在 BO(nm)B\in O(\frac n{\sqrt m}) 时取得最小值,总复杂度 O(nm)O(n\sqrt m)

常数优化:

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

带修莫队

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