欢迎光临散文网 会员登陆 & 注册

CCF CSP 2020-12 T5 星际旅行 (动态开点线段树维护矩阵)

2021-12-01 10:31 作者:昵称不能为空voidf  | 我要投稿

大意:您需要写一个数据结构维护一个三元组数组,支持以下四种操作:

1、区间中的所有三元组的每个分量分别加上a,b,c

2、区间中的所有三元组的每个分量分别乘以k

3、区间中的所有三元组从{x, y, z}旋转为{y, z, x}

4、查询区间中的所有三元组的各分量和的平方再求和


其中1、2、4是线段树基本操作,3则可以通过矩阵乘法进行初等变换来解决。


树上每个节点维护一个这样的矩阵:%5Cbegin%7Bbmatrix%7D%0Ax%20%26%20y%20%26%20z%20%5C%5C%200%20%26%200%20%26%200%20%5C%5C%200%20%26%200%20%26%200%0A%5Cend%7Bbmatrix%7D

分别表示区间x、y、z的和。操作1可以用相同类型矩阵打tag相加。

操作2: 左乘%5Cbegin%7Bbmatrix%7D%0Ak%20%26%200%20%26%200%20%5C%5C%200%20%26%20k%20%26%200%20%5C%5C%200%20%26%200%20%26%20k%0A%5Cend%7Bbmatrix%7D

操作3:左乘%5Cbegin%7Bbmatrix%7D%0A0%20%26%200%20%26%201%20%5C%5C%201%20%26%200%20%26%200%20%5C%5C%200%20%26%201%20%26%200%0A%5Cend%7Bbmatrix%7D

因为矩阵乘法有结合律,所以标记可以合并从而保证单次操作复杂度O(logn)。但是会带一个3%5E3的矩阵乘法常数,也可以把加法换成1*3的矩阵稍微优化一下。


还有一种维护方法是维护4*4的齐次矩阵,就可以把加法变成乘法,于是只需要乘法标记,简化掉双标记线段树的麻烦。


恶心的地方:n<=1e9

于是需要动态开点。试了下珂朵莉树,由于没有区间赋值,发现1e4内还可以0.76s,4e4暴涨到86s导致TLE


通过代码:

https://paste.ubuntu.com/p/s5F4vj2w5t/



CCF CSP 2020-12 T5 星际旅行 (动态开点线段树维护矩阵)的评论 (共 条)

分享到微博请遵守国家法律