设代数结构 \((S,\circ)\) 是交换半群 。给定 \(a_1,a_2,\cdots,a_n \in S\),对每个 \(i\) 求出
\b_i=a_1 \\circ \\cdots \\circ a_{i-1} \\circ a_{i+1} \\circ \\cdots \\circ a_n \\
如果信息容易合并,则直接使用前后缀并即可。
前后缀并
预处理求前后缀信息并
\\\begin{aligned} \\text{pre}_i\&=a_1 \\circ a_2 \\circ \\cdots a_i\\\\ \\text{suf}_i\&=a_i \\circ a_{i+1} \\circ \\cdots a_n \\end{aligned} \\
那么 \(b_i=\text{pre}{i-1} \circ \text{suf}{i+1}\)。
缺一分治主要用于加元素容易,但合并状态困难的情形。
例子
- 01 背包加物品 \(O(V)\),合并是 \((\min,+)\) 卷积 \(O(V^2)\)。
- 全源最短路加点 \(O(n^2)\),合并是 \((\min,+)\) 矩乘 \(O(n^3)\)。
对序列分治,设缺失区间 \(l,r\) 中点 \(m\)。维护外部信息并
\\\begin{aligned} P\&=a_1\\circ \\cdots \\circ a_{l-1} \\circ a_{r+1} \\circ \\cdots \\circ a_n \\end{aligned} \\
考虑下述算法流程:
- 加入 \(l,m\) 的元素,得到 \(P'=a_1 \circ \cdots \circ a_m \circ a_{r+1} \circ \cdots \circ a_n\),递归 \((m,r]\)。
- 撤销 \(l,m\) 元素的贡献得到 \(P'=P\)。
- 加入 \((m,r]\) 的元素,得到 \(P'=a_1 \circ \cdots \circ a_{l-1} \circ a_{m+1} \circ \cdots \circ a_n\),递归 \(l,m\)。
递归到分治树叶子 \(l=r\) 时,恰有 \(b_i=P\)。复杂度 \(O(nk \log n)\),其中 \(k\) 是半群加点 & 撤销的复杂度。