$\text{Solution}$
非常毒瘤的题目。
考场上时一看就知道是线段树维护,可能要用矩阵快速幂,然后就不会了。
实际上就是 线段树维护 + 矩阵快速幂。
做这道题需要有一点前置知识,就是 $\text{Fibonacci}$ 数列是可加的 。
具体怎么说呢,就是有一个第一项是 $x$ , 第二项是 $y$ 的 $\text{Fibonacci}$ 数列和另一个第一项是 $z$ , 第二项是 $w$ 的 $\text{Fibonacci}$ 数列。那么这两个数列相加就是一个第一项是 $x + z$ ,第二项是 $y + w$ 的 $\text{Fibonacci}$ 数列。证明什么的就略过了。
接下来我们就可以考虑对每个区间将 $\text{Fibonacci}$ 数列首两项和区间和作为 $\text{tag}$ ,每次修改的话可以叠加。
对于一个操作 $1 \quad x \quad y \quad u \quad v$ 。首先在 $x$ 的位置加上 $u$ , 在 $y$ 的位置加上 $v$ 。然后在之后的位置加入 $u, v$ 。
对于添加 $[L, R]$ ,当前区间 $[l, r]$ 满足 $[l, r]$ 覆盖 $[L, R]$ ,此时标记的是 $l-L+1$ 项之后的 $\text{Fibonacci}$ 数列。需要用矩阵进行预处理。转移矩阵为
快速幂一下,调用的时候把 $F_1$ 和 $F_2$ 的值改掉就会得到相应的 $\text{Fibonacci}$ 数列的项和和。
另外给出的操作中是可能反向的,需要正反两棵线段树。询问的时候需要叠加
步骤比较多,常数比较大,考验码量
$\text{Code}$
1 |
|