标签:答案 通过 log line 复杂度 end 思维 修改 自己的
dp方程设为 f[i] 最后在 D点,g[i] 表示最后不在D点。最后 g[] 可以通过矩阵加速数列求得,数据可以强化,复杂度 \(O(logn)\)
套路题。大家都知道要用线段树,可是不知道怎么去用?那就用我们的好帮手矩阵来解决这个问题。线段树+矩阵
把 x=x+y 和 y = x+y 这两种运算看成在矩阵上的矩阵乘法,两种运算分别对应下面两个矩阵:
\begin{bmatrix}
X & Y
\end{bmatrix}
\begin{bmatrix}
1 & 1\
0 & 1
\end{bmatrix}
=
\begin{bmatrix}
X & X+Y
\end{bmatrix}
\begin{bmatrix}
X & Y
\end{bmatrix}
\begin{bmatrix}
1 & 0\
1 & 1
\end{bmatrix}
=
\begin{bmatrix}
X+Y & Y
\end{bmatrix}
理解?
这时我们把线段树上的每个点看成‘A’,‘B’所对应的矩阵。区间查询我们只需要把这个区间的矩阵相乘,最后再和 [x,y] 这个原矩阵相乘即可得出答案。
那么修改呢?
考虑到修改一个区间就是把这个区间的‘A’变成‘B’,‘B’变成‘A’。线段树上的一条线段修改一次是一个固定的值,而且再修改一次回来又回到了原来的值(这里的值是矩阵)。一开始我们每个点保留两个矩阵,mul[0]表示自己的矩阵,mul[1]表示翻转后的矩阵,所谓这个区间修改,就是交换 mul[0],mul[1]。(尝试用线段树思维理解一下qwq)至此,我们做出了此题。(然而我还在调程序T_T 呜呜呜)
标签:答案 通过 log line 复杂度 end 思维 修改 自己的
原文地址:https://www.cnblogs.com/BaseAI/p/11941153.html