这是本文档旧的修订版!
用于解决一些 $\text{dp}$ 递推式简短但需要支持修改的问题,时间复杂度为 $O(nk^3\log n)$,其中 $k$ 为递推式的相关项。
给定长度为 $n$ 的序列,接下来两种操作:
首先考虑如何进行 $\text{dp}$ 递推,设 $f(i)$ 表示所有 $[1,i]$ 的后缀的最大元素和,$g(i)$ 表示所有 $[1,i]$ 的连续子序列的最大元素和。
$$ f(i)=\max(f(i-1)+a_i,a_i),g_i=\max(g(i-1),f(i))=\max(f(i-1)+a_i,g(i-1),a_i) $$
考虑用广义矩阵乘法维护转移,线段树要求广义矩阵乘法需要满足结合律。
$$ \begin{equation}\begin{split} (ABC)_{i,j}&=\sum_{k=1}^n (AB)_{i,k}\oplus C_{k,j} \\ &=\sum_{k=1}^n \left(\left(\sum_{t=1}^nA_{i,t}\oplus B_{t,k}\right)\oplus C_{k,j}\right)\\ & =\sum_{k=1}^n\sum_{t=1}^nA_{i,t}\oplus B_{t,k}\oplus C_{k,j}\\ & =\sum_{t=1}^n\left(A_{i,t}\oplus\left(\sum_{k=1}^nB_{t,k}\oplus C_{k,j}\right)\right)\\ & =\sum_{t=1}^nA_{i,t}\oplus (BC)_{t,j}\\ \end{split}\end{equation} $$ 不难发现,为了使得上式成立,应该有 $a\oplus\sum_{i=1}^n b_i=\sum_{i=1}^n a\oplus b_i$。
普通矩阵乘法中 $\sum$ 表示求和,$\oplus$ 表示乘法。本题可以用 $\max$ 代替 $\sum$,$+$ 代替 $\oplus$。
于是有
$$ \begin{bmatrix}a_i & -\infty & a_i \\a_i & 0 & a_i \\-\infty & -\infty & 0 \\ \end{bmatrix} \begin{bmatrix}f(i-1)\\g(i-1)\\0\end{bmatrix} =\begin{bmatrix}f(i)\\g(i)\\0\end{bmatrix} $$
注意查询的初始值和正常 $\text{dp}$ 相同
$$ \begin{bmatrix}f(0)\\g(0)\\0\end{bmatrix} =\begin{bmatrix}0\\-\infty\\0\end{bmatrix} $$