题解

(不会矩阵加速的先去学矩阵加速)

反正我想不到线段树维护矩阵。我太菜了。

我们在线段树上维护一个区间的斐波那契的列矩阵的和。

然后询问时提取每个符合题意列矩阵的答案项(不是列矩阵存了两项吗,一个是当前项,一个是用来递推的)

因为矩阵乘有结合律所以区间加这个操作就直接区间乘变换矩阵的x次方就行。

然后记得开long long

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const long long mod=1e9+;
const long long N=;
long long n,m;
struct jz{
long long a[][];
}e,h,be,f[N],ma;
struct tree{
long long l,r;
jz sum,lazy;
}tr[N*];
jz jzc(jz a,jz b,jz c){
for(long long i=;i<=;i++)
for(long long j=;j<=;j++)
for(long long k=;k<=;k++){
c.a[i][j]+=a.a[i][k]*b.a[k][j];
c.a[i][j]%=mod;
}
return c;
}
jz ksm(long long b,jz x){
jz ans;
ans=ma;
while(b){
if(b&){
ans=jzc(ans,x,h);
}
b>>=;
x=jzc(x,x,h);
}
return ans;
}
void update(long long now){
tr[now].sum.a[][]=(tr[now*].sum.a[][]+tr[now*+].sum.a[][])%mod;
tr[now].sum.a[][]=(tr[now*].sum.a[][]+tr[now*+].sum.a[][])%mod;
}
void build(long long l,long long r,long long now){
tr[now].l=l;tr[now].r=r;tr[now].lazy=ma;
if(l==r){
tr[now].sum=f[l];
return;
}
long long mid=(l+r)>>;
build(l,mid,now*);
build(mid+,r,now*+);
update(now);
}
bool pd(jz a,jz b){
for(long long i=;i<=;i++)
for(long long j=;j<=;j++)
if(a.a[i][j]!=b.a[i][j])return false;
return true;
}
void pushdown(long long now){
if(pd(tr[now].lazy,ma))return;
tr[now*].sum=jzc(tr[now*].sum,tr[now].lazy,h);
tr[now*+].sum=jzc(tr[now*+].sum,tr[now].lazy,h);
tr[now*].lazy=jzc(tr[now*].lazy,tr[now].lazy,h);
tr[now*+].lazy=jzc(tr[now*+].lazy,tr[now].lazy,h);
tr[now].lazy=ma;
}
void add(long long l,long long r,long long now,jz x){
pushdown(now);
if(tr[now].l==l&&tr[now].r==r){
tr[now].sum=jzc(tr[now].sum,x,h);
tr[now].lazy=x;
return;
}
long long mid=(tr[now].l+tr[now].r)>>;
if(l>mid)add(l,r,now*+,x);
else if(r<=mid)add(l,r,now*,x);
else{
add(l,mid,now*,x);
add(mid+,r,now*+,x);
}
update(now);
}
long long query(long long l,long long r,long long now){
pushdown(now);
if(tr[now].l==l&&tr[now].r==r){
return tr[now].sum.a[][];
}
long long mid=(tr[now].l+tr[now].r)>>;
if(l>mid)return query(l,r,now*+);
else if(r<=mid)return query(l,r,now*);
else return (query(l,mid,now*)+query(mid+,r,now*+))%mod;
}
int main(){
scanf("%lld%lld",&n,&m);
e.a[][]=;e.a[][]=e.a[][]=e.a[][]=;
be.a[][]=;be.a[][]=;
for(long long i=;i<=;i++)
for(long long j=;j<=;j++)
if(i==j)ma.a[i][j]=;
else ma.a[i][j]=;
for(long long i=;i<=n;i++){
long long x;
scanf("%lld",&x);
if(x==)f[i]=be;
else f[i]=jzc(be,ksm(x-,e),h);
}
build(,n,);
for(long long i=;i<=m;i++){
long long k;
scanf("%lld",&k);
if(k==){
long long l,r,x;
scanf("%lld%lld%lld",&l,&r,&x);
add(l,r,,ksm(x,e));
}
else{
long long l,r;
scanf("%lld%lld",&l,&r);
printf("%lld\n",query(l,r,));
}
}
return ;
}

CF718C Sasha and Array(线段树维护矩阵)的更多相关文章

  1. CF719E. Sasha and Array [线段树维护矩阵]

    CF719E. Sasha and Array 题意: 对长度为 n 的数列进行 m 次操作, 操作为: a[l..r] 每一项都加一个常数 C, 其中 0 ≤ C ≤ 10^9 求 F[a[l]]+ ...

  2. Codeforces Round #373 (Div. 2) E. Sasha and Array 线段树维护矩阵

    E. Sasha and Array 题目连接: http://codeforces.com/contest/719/problem/E Description Sasha has an array ...

  3. CF718C Sasha and Array 线段树 + 矩阵乘法

    有两个操作: 将 $[l,r]$所有数 + $x$ 求 $\sum_{i=l}^{r}fib(i)$ $n=m=10^5$   直接求不好求,改成矩阵乘法的形式:  $a_{i}=M^x\times ...

  4. CF718C Sasha and Array [线段树+矩阵]

    我们考虑线性代数上面的矩阵知识 啊呸,是基础数学 斐波那契的矩阵就不讲了 定义矩阵 \(f_x\) 是第 \(x\) 项的斐波那契矩阵 因为 \(f_i * f_j = f_{i+j}\) 然后又因为 ...

  5. CF718C Sasha and Array 线段树+矩阵加速

    正解:线段树 解题报告: 传送门! 首先这种斐波拉契,又到了1e9的范围,又是求和什么的,自然而然要想到矩阵加速昂 然后这里主要是考虑修改操作,ai+=x如果放到矩阵加速中是什么意思呢QAQ? 那不就 ...

  6. 线段树维护矩阵【CF718C】 Sasha and Array

    Description 有一个长为\(n\)的数列\(a_{1},a_{2}...a_{n}\),你需要对这个数列维护如下两种操作: \(1\space l \space r\space x\) 表示 ...

  7. 【Codeforces718C】Sasha and Array 线段树 + 矩阵乘法

    C. Sasha and Array time limit per test:5 seconds memory limit per test:256 megabytes input:standard ...

  8. Subsequence Count 2017ccpc网络赛 1006 dp+线段树维护矩阵

    Problem Description Given a binary string S[1,...,N] (i.e. a sequence of 0's and 1's), and Q queries ...

  9. hdu 5068 线段树维护矩阵乘积

    http://acm.hdu.edu.cn/showproblem.php?pid=5068 题意给的略不清晰 m个询问:从i层去j层的方法数(求连段乘积)或者修改从x层y门和x+1层z门的状态反转( ...

随机推荐

  1. Creating a Custom Page Layout in SharePoint 2013

    Creating a Custom Page Layout in SharePoint 2013 In my last article, I documented how to create a Ma ...

  2. HTML的常用标签属性及使用时需注意的一些细节

    前言 本篇随笔的主要是复习一下常用的一些HTML(Hyper Text Markup Language)标签及其属性,并总结一些使用过程中需要注意的一些细节,本篇提及的常用标签主要有: iframe标 ...

  3. 洛谷P2118 比例简化(暴力)

    题目描述 在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果.例如,对某一观点表示支持的有1498 人,反对的有 902人,那么赞同与反对的比例可以简单的记为1498:902. 不过,如 ...

  4. Codeforces 987B. High School: Become Human

    解题思路: 1.题意:判断x^y和y^x谁大谁小. 2.由于x^y和y^x太大了,时间复杂度也不允许,所以做同等变换,比较e^(ylnx)和e^(xlny). 3.即为比较ylnx和xlny的大小. ...

  5. 3ds Max怎么制作亮木材质的球体

    3DSMax怎么制作亮木材质的球体?3DSMax中想要设计一款亮木材质的球体,该怎么设置呢?下面我们就来看看详细的教程,需要的朋友可以参考下! 1.运行软件,选择材质编辑器图标: 3.双击拖拽出的材质 ...

  6. angular踩坑记录

    ng-repeat和ng-click同时使用的时候,注意不能直接在ng-click当中写代码,必须在当前$scope中绑定一个事件,转为调用该事件.否则会出现意想不到的情况.具体原因点击这里. 使用自 ...

  7. Converting Legacy Chrome IPC To Mojo

    Converting Legacy Chrome IPC To Mojo Looking for Mojo Documentation? Contents Overview Deciding What ...

  8. python自动化报错

    今天使用python.然而遇见了报错.抓狂的一笔.有说path写错的,有说是...网上查到的资料也是很少.后来突然发现,页面上我暂时能看到的元素可以定位并进行操作.看不到的无法进行...ps此时我没有 ...

  9. 【BZOJ4002】[JLOI2015]有意义的字符串 - 矩阵乘法

    题意: 给出b,d,n,求$\lfloor(\frac{b+\sqrt{d}}{2})^n\rfloor \mod 999999999999999989$(原题是7528443412579576937 ...

  10. 微信小程序 上传图片

    效果图  如上,js  如下,在页面循环图片就可以 /** * 选择图片 */ uploadImgAdd: function(e) { var imgs = this.data.imgs; wx.ch ...