缺一分治
设代数结构 \((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\) 是半群加点 & 撤销的复杂度。

浙公网安备 33010602011771号