【学习笔记】[NOI2021] 密码箱
想起之前考试做过的一道题,当时做法好像是用线段树维护一个分段复合函数,当时切掉了,但是这道题换成矩阵就又不会了。还是太菜了。
既然都要复合了,肯定要满足结合律。因为满足了结合律,所以线段树上左右儿子可以合并。
什么东西满足结合律?自然是矩阵。这个东西用来处理线性变换尤其好用,而且矩阵的性质其实是相当丰富的,比如矩阵可以求逆。
方便起见,就用左乘好了。分数只有分子和分母两项,所以矩阵的大小为 2 × 2 2\times 2 2×2即可。那么我们有 [ x y ] × [ a i 1 1 0 ] = [ a i x + y x ] \begin{bmatrix}x\ y\end{bmatrix}\times \begin{bmatrix}a_i\ 1\\1\ \ 0\end{bmatrix}=\begin{bmatrix}a_ix+y\ \ x\end{bmatrix} [x y]×[ai 11 0]=[aix+y x]。大胆猜测 W W W, E E E两种操作都分别对应一种矩阵,具体来说:
1.1
1.1
1.1
W
W
W操作对应左乘矩阵
[
1
1
0
1
]
\begin{bmatrix}1\ 1\\0\ 1\end{bmatrix}
[1 10 1]。
1.2
1.2
1.2
E
E
E 操作对应两种情况,但是有一个结论:两种情况对应同一个矩阵。第二种情况对应的矩阵是
[
1
1
1
0
]
×
[
1
1
1
0
]
×
[
1
−
1
0
1
]
=
[
2
−
1
1
0
]
\begin{bmatrix}1\ 1\\1 \ 0\end{bmatrix}\times \begin{bmatrix}1\ 1\\1\ 0\end{bmatrix}\times \begin{bmatrix}1\ -1\\0\ \ \ \ 1\end{bmatrix}=\begin{bmatrix}2\ -1\\1\ \ \ \ 0\end{bmatrix}
[1 11 0]×[1 11 0]×[1 −10 1]=[2 −11 0];第一种情况对应的矩阵是
[
1
1
1
0
]
×
[
1
1
0
1
]
×
[
1
1
1
0
]
−
1
=
[
2
−
1
1
0
]
\begin{bmatrix}1\ 1\\1\ 0\end{bmatrix}\times \begin{bmatrix}1\ 1\\0\ 1\end{bmatrix}\times \begin{bmatrix}1\ 1\\1\ 0\end{bmatrix}^{-1}=\begin{bmatrix}2\ -1\\1\ \ \ \ 0\end{bmatrix}
[1 11 0]×[1 10 1]×[1 11 0]−1=[2 −11 0]。不难发现这些巧合事实上都是出题人的精心设计。
然后把线段树换成平衡树,这道题就做完了。
如果正常来做的话,那么一个节点就要维护 4 4 4个矩阵,这样常数就会有点大。但是因为两个标记的先后顺序不影响答案所以代码难度也还好。
复杂度 O ( n log n ) O(n\log n) O(nlogn)。
写了一发,感受是甚至比普通的平衡树要好写。
__EOF__

本文链接:https://www.cnblogs.com/cqbzly/p/17529940.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2022-07-05 【学习笔记】AGC010
2022-07-05 【学习笔记】zkw 线段树