CF718C Sasha and Array(线段树维护矩阵)

题解
(不会矩阵加速的先去学矩阵加速)
反正我想不到线段树维护矩阵。我太菜了。
我们在线段树上维护一个区间的斐波那契的列矩阵的和。
然后询问时提取每个符合题意列矩阵的答案项(不是列矩阵存了两项吗,一个是当前项,一个是用来递推的)
因为矩阵乘有结合律所以区间加这个操作就直接区间乘变换矩阵的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(线段树维护矩阵)的更多相关文章
- CF719E. Sasha and Array [线段树维护矩阵]
CF719E. Sasha and Array 题意: 对长度为 n 的数列进行 m 次操作, 操作为: a[l..r] 每一项都加一个常数 C, 其中 0 ≤ C ≤ 10^9 求 F[a[l]]+ ...
- 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 ...
- CF718C Sasha and Array 线段树 + 矩阵乘法
有两个操作: 将 $[l,r]$所有数 + $x$ 求 $\sum_{i=l}^{r}fib(i)$ $n=m=10^5$ 直接求不好求,改成矩阵乘法的形式: $a_{i}=M^x\times ...
- CF718C Sasha and Array [线段树+矩阵]
我们考虑线性代数上面的矩阵知识 啊呸,是基础数学 斐波那契的矩阵就不讲了 定义矩阵 \(f_x\) 是第 \(x\) 项的斐波那契矩阵 因为 \(f_i * f_j = f_{i+j}\) 然后又因为 ...
- CF718C Sasha and Array 线段树+矩阵加速
正解:线段树 解题报告: 传送门! 首先这种斐波拉契,又到了1e9的范围,又是求和什么的,自然而然要想到矩阵加速昂 然后这里主要是考虑修改操作,ai+=x如果放到矩阵加速中是什么意思呢QAQ? 那不就 ...
- 线段树维护矩阵【CF718C】 Sasha and Array
Description 有一个长为\(n\)的数列\(a_{1},a_{2}...a_{n}\),你需要对这个数列维护如下两种操作: \(1\space l \space r\space x\) 表示 ...
- 【Codeforces718C】Sasha and Array 线段树 + 矩阵乘法
C. Sasha and Array time limit per test:5 seconds memory limit per test:256 megabytes input:standard ...
- 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 ...
- hdu 5068 线段树维护矩阵乘积
http://acm.hdu.edu.cn/showproblem.php?pid=5068 题意给的略不清晰 m个询问:从i层去j层的方法数(求连段乘积)或者修改从x层y门和x+1层z门的状态反转( ...
随机推荐
- HTML5学习笔记(一):HTML5基本概念
1.HTML的发展历程 HTML(1994年,W3C成立) HTML2(1995年) HTML3(1996年) HTML4.0(1997年) HTML4.01(1999年)——HTML5(2008年: ...
- VSCode向上的代码提示消除
VSCode虽然好用, 但是有些用户体验实在非常差, 比如这种往上面弹的类型提示... 在用户设置中增加: "editor.parameterHints": false
- HTML 导航框架
首页效果图 点击链接一效果图 代码结构 index.jsp <%@ page language="java" import="java.util.*" p ...
- Swift 中的协议
Swift 中的协议协议是为方法.属性等定义一套规范,没有具体的实现,类似于Java中的抽象接口,它只是描述了方法或属性的骨架,而不是实现.方法和属性实现还需要通过定义类,函数和枚举完成. 协议定义 ...
- SpringCloud学习笔记(17)----Spring Cloud Netflix之服务网关Zuul的使用
1. 什么时候Zuul? Zuul是一个基于jvm路由和服务端的负载均衡器,在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架. 路由功能:相当于nginx的反向代理 比如: / 可能需要映射到 ...
- dedecmsV5.7自定义图片字段调用方法
正常情况下,在列表页(也就是 {dede:list}标签)调用附加的图片类型字段则会出现Fatal error: Call to a member function GetInnerText() on ...
- Spring MVC 搭建过程中web.xml配置引入文件的路径问题
为啥要说一下这么low的问题,因为我是一个比较low的人,哈哈.本来我技术有限,没事干自己撘个环境找找乐趣,结果被各种基础问题,弄的一脸蒙蔽.算了不多说,直接说问题. 1.首先说一下java编译后的文 ...
- mac终端安装webpack的时候报错Err,解决的办法 sudo npm install webpack -g
MacBook-Air:~ xxx$ npm install webpack -g npm WARN invalid config registry="" npm WARN inv ...
- 【Paper Reading】Bayesian Face Sketch Synthesis
Contribution: 1) Systematic interpretation to existing face sketch synthesis methods. 2) Bayesian fa ...
- 洛谷P5087 数学
DP. 设f[i][j]为前j个数中选i个数的所有组合的分数之和 决策: 不选这个数,得分为f[i][j - 1] 选这个数,得分为f[i - 1][j - 1] * a[j] 可以得到状态转移方程为 ...