笔记:线段树的多标记问题

浅谈线段树的多标记问题

本文从线性代数的角度讨论线段树的若干多标记下传问题。

标记下传的本质是仿射变换,用矩阵乘法就能把多个标记转化为一个矩阵的标记。

区间加乘

做模板题时,你可能会想为什么乘法标记要把加法标记也乘积。

我们需要维护 区间和 和 子树大小:

\[\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

posted @ 2025-05-09 11:38  蒻蒻虫  阅读(26)  评论(0)    收藏  举报