码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 矩阵题 题单

时间:2019-11-27 12:16:47      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:答案   通过   log   line   复杂度   end   思维   修改   自己的   

Matrix

CF 166E Tetrahedron

dp方程设为 f[i] 最后在 D点,g[i] 表示最后不在D点。最后 g[] 可以通过矩阵加速数列求得,数据可以强化,复杂度 \(O(logn)\)

CF 1252K Addition Robot

套路题。大家都知道要用线段树,可是不知道怎么去用?那就用我们的好帮手矩阵来解决这个问题。线段树+矩阵

把 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 呜呜呜)

Codeforces 矩阵题 题单

标签:答案   通过   log   line   复杂度   end   思维   修改   自己的   

原文地址:https://www.cnblogs.com/BaseAI/p/11941153.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!