笔记:线段树的多标记问题
浅谈线段树的多标记问题
本文从线性代数的角度讨论线段树的若干多标记下传问题。
标记下传的本质是仿射变换,用矩阵乘法就能把多个标记转化为一个矩阵的标记。
区间加乘
做模板题时,你可能会想为什么乘法标记要把加法标记也乘积。
我们需要维护 区间和 和 子树大小:
\[\begin{bmatrix}
sum\\
siz
\end{bmatrix}\]
对于加法操作:
\[\begin{bmatrix}
1&add\\
0&1
\end{bmatrix} \begin{bmatrix}
sum\\
siz
\end{bmatrix}=\begin{bmatrix}
sum+siz\times add\\
siz
\end{bmatrix}\]
对于乘法:
\[\begin{bmatrix}
mul&0\\
0&1
\end{bmatrix} \begin{bmatrix}
sum\\
siz
\end{bmatrix}=\begin{bmatrix}
sum\times mul\\
siz
\end{bmatrix}\]
先加法再乘法:
\[\begin{bmatrix}
mul&0\\
0&1
\end{bmatrix} \begin{bmatrix}
1&add\\
0&1
\end{bmatrix}=\begin{bmatrix}
mul&mul\times add\\
0&1
\end{bmatrix}\]
先乘法后加法:
\[\begin{bmatrix}
1&add\\
0&1
\end{bmatrix} \begin{bmatrix}
mul&0\\
0&1
\end{bmatrix}=\begin{bmatrix}
mul&add\\
0&1
\end{bmatrix}\]
可以发现此时只需要维护矩阵第一行两个标记即可,乘法操作时要把加法操作也乘积,下传时先乘法后加法。
区间加法,覆盖
正确的逻辑为:区间覆盖时清空加法标记。
加法的矩阵为:
\[\begin{bmatrix}
1&add\\
0&1
\end{bmatrix}\]
覆盖的矩阵为:
\[\begin{bmatrix}
0&cov\\
0&1
\end{bmatrix}\]
先加法后覆盖:
\[\begin{bmatrix}
0&cov\\
0&1
\end{bmatrix} \begin{bmatrix}
1&add\\
0&1
\end{bmatrix}=\begin{bmatrix}
0&cov\\
0&1
\end{bmatrix}\]
发现加法标记被清空了。
后面会补充更多的操作QAQ

浙公网安备 33010602011771号