题意:
给你一个数列,有两种操作1 l r x 给[l,r]区间上的数加上x, 2 l r 询问[l,r]区间fibonacci数列的和(f[l]+f[l+1]+……f[r])
题解:
这样的区间加和区间询问很容易想到线段树成段更新,关键是怎么存储信息,我们都知道fibonacci数列可以用矩阵快速幂递推,基础矩阵是a[0][0]=1,a[0][1]=1,a[1][0]=1,a[1][1]=0,a[0][0]中存储的就是当前的fibonacci值(不会这个可以先做下poj3070)
然后我们可以在线段树的每个节点都存一个2*2的矩阵,这个矩阵就是当前fibonacci数列的运算矩阵,这是线段树的建树过程,
现在我们来看操作1 [l,r]区间上的数加上x 我们设A[x]矩阵代表基础矩阵乘上x次之后形成的矩阵(这里提下在上一条建树操作的时候数值为1的矩阵应该是单位矩阵,数值y大于等于1的存的应该是A[y-1]) 给区间数加上x就相当于给区间所有矩阵乘上一个A[x] 也即A[x]*(A[l]+A[l+1]+……+A[r]) 这样1操作可以用lazy的思想直接对整段进行更新
然后看操作2 我们只要对[l,r]中存的矩阵中[0][0]位置的数求和就是答案
注意:
线段树操作时所有的lazy,sum都用2*2的矩阵来存,并且lazy操作时矩阵是相乘而不是想加(本人在这儿错了好久)
#include