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门的状态反转( ...
随机推荐
- 记一次"未将对象引用设置到对象的实例"问题的排查过程
最近在给一个老项目做数据对接接口. 背景一 该项目最后更新日期为2006年,使用ASP.NET WebForm..Net2.0.OJB.Castle Avtive Record等.由于是某集团的子系统 ...
- 解决局域网内无法IP访问IIS已发布的网站
在IIS上发布的网站,本地可以访问,但是局域网内其他电脑却访问不了,原来是防火墙的问题,关闭它就可以访问了. 上面是我的简单操作 后来又百度了一下,发现有个更详细的操作:http://jingyan. ...
- 新版Eclipse找不到Java EE Module Dependencies选项
在 Eclipse Galileo (3.5) 版本或Ganymede (3.4) 等更老的版本中, 你可以使用Java EE Module Dependencies 选项来组织你的项目结构,确保依赖 ...
- 51nod 2020 排序相减(暴力解法)
题目: 代码: #include <bits\stdc++.h> using namespace std; int trim(int x){ ]; ;i < ; i++){ a[i] ...
- 优动漫PAINT个人版绘制树叶教程
超详细树叶绘制法,更有配套绘树小TIPE!让你画树So Easy~一秒变身,画树达人! 优动漫PAINT个人版软件下载:http://www.dongmansoft.com/chanpin.html ...
- 使用3ds Max制作卡通狗教程
使用软件::3ds Max 软件下载:http://www.xy3dsmax.com/xiazai.html 全教程完,学完记得交作业.如果本教程对您有所帮助,请推荐给你的朋友. 全教程完,学完记得交 ...
- Dropout 下(关于《Dropout: A Simple way to prevent neural networks from overfitting》)
先上菜单: 摘要: Deep neural nets with a large number of parameters are very powerful machine learning syst ...
- 关于CAS操作
在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问题. (2 ...
- FZU 1980 AbOr's story
AbOr's story Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on FZU. Original I ...
- Linux的中断和系统调用 & esp、eip等寄存器
http://www.linuxidc.com/Linux/2012-11/74486.htm 一共三篇 中断一般分为三类: 1.由计算机硬件异常或故障引起的中断,称为内部异常中断: 2.由程序中执行 ...