题目链接
题目分析
题目大意
有n
层楼,在魔法学校,每一层各有两个楼梯,无论你从哪一个楼梯都可以通往下一层,但是只能往上,不能往下。有的时候,楼梯会损毁,就无法通向下一层,但是有的时候又会自动修复。先给出楼层的数量n
,以及m
行信息,当第一个数字是0
时,给出x
和y
,分别代表哈利波特现在所在的楼层和老师所在的楼层,查询哈利波特到达老师所在楼层的方法数。当的一个数字为1
时,给出一个数字n
和x
,y
,表示第n
层的第x
扇门通往第n+1
层的第y
扇门的楼梯坏了(如果本身是好的),表示第n
层的第x
扇门通往第n+1
层的第y
扇门的楼梯好了(如果本身是坏的)。
解析
手推一下,很容易发现规律,如果本层的楼梯和下面一层的楼梯都是好的的话,那么必然可以用矩阵来表示通网当前各门的情况数量。一开始很容易想到矩阵乘法,然后顺理成章的相当了矩阵快速幂,不过当其中间某几个楼梯是坏的的时候,要单独拎出来各段来计算,想法不太优越。如果能把这个问题转换为log(n)时间的更新和查询就好了,那么就很容易相当使用线段树,node[i]记录到达第i层的两扇门分别是从下面一层的每扇门传递过来的数量,这样将node[x]到node[y-1]累乘起来就是答案。根据线段树的性质,更新和查询效率都很高。
代码
1 |
|