Codeforces 718C. Sasha and Array(线段树)
传送门
解题思路:
这道题给了我们一个崭新的角度来看线段树。
我们常常使用的线段树是维护区间的函数的。
这里呢,提示我们线段树其实还可以维护递推。
美好的矩阵递推性质支持了这一功能。
或者说,对于递推项求和,可以使用线段树维护矩阵。
区间向前递推可以用懒惰标记记录递推矩阵。
区间的查询可以是子节点矩阵和。
这其实也是满足分配率的。
最后pushup,pushdown搞一搞就好了。
代码(闲来无事卡常码风突变):
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lll spc<<1
#define rrr spc<<1|1
typedef unsigned long long lnt;
typedef unsigned int ixt;
const lnt mod=(lnt)(1e9+);
struct squ{
lnt s[][];
inline void res(void)
{
memset(s,,sizeof(s));
return ;
}
inline void O1(void)
{
for(register int i=;i<;i++)
s[i][i]=;
return ;
}
inline squ friend operator + (const squ &a,const squ &b)
{
squ ans;
for(register int i=;i<;i++)
{
for(register int j=;j<;j++)
{
ans.s[i][j]=(a.s[i][j]+b.s[i][j])%mod;
}
}
return ans;
}
inline squ friend operator * (const squ &a,const squ &b)
{
squ ans;
for(register int i=;i<;i++)
{
for(register int j=;j<;j++)
{
ans.s[i][j]=;
for(register int k=;k<;k++)
{
ans.s[i][j]=(ans.s[i][j]+a.s[i][k]*b.s[k][j])%mod;
}
}
}
return ans;
}
inline squ friend operator ^ (squ a,lnt b)
{
squ ans=a;
b--;
while(b)
{
if(b&)
ans=ans*a;
a=a*a;
b=b/;
}
return ans;
}
}sta,pro;
struct trnt{
squ sum;
squ lzt;
bool op;
}tr[];
ixt n,m;
ixt a[];
inline void read(ixt &ans)
{
ans=;
char ch=getchar();
while(ch<''||ch>'')
ch=getchar();
while(ch>=''&&ch<='')
ans=ans*+ch-'',ch=getchar();
return ;
}
inline squ Fib(const lnt &x)
{
squ tmp=pro^x;
return tmp*sta;
}
inline void pushup(const int &spc)
{
tr[spc].sum=tr[lll].sum+tr[rrr].sum;
return ;
}
inline void add(const int &spc,const squ &v)
{
tr[spc].op=true;
tr[spc].lzt=v*tr[spc].lzt;
tr[spc].sum=v*tr[spc].sum;
return ;
}
inline void pushdown(const int &spc)
{
if(tr[spc].op)
{
add(lll,tr[spc].lzt);
add(rrr,tr[spc].lzt);
tr[spc].lzt.res();
tr[spc].lzt.O1();
tr[spc].op=;
}
return ;
}
inline void build(const int &l,const int &r,const int &spc)
{
tr[spc].lzt.res();
tr[spc].lzt.O1();
if(l==r)
{
tr[spc].sum=Fib(a[l]);
return ;
}
int mid=(l+r)>>;
build(l,mid,lll);
build(mid+,r,rrr);
pushup(spc);
return ;
}
inline void update(const int &l,const int &r,const int &ll,const int &rr,const int &spc,const squ &v)
{
if(ll>r||l>rr)
return ;
if(ll<=l&&r<=rr)
{
add(spc,v);
return ;
}
int mid=(l+r)>>;
pushdown(spc);
update(l,mid,ll,rr,lll,v);
update(mid+,r,ll,rr,rrr,v);
pushup(spc);
return ;
}
inline squ query(const int &l,const int &r,const int &ll,const int &rr,const int &spc)
{
squ ans;
ans.res();
if(l>rr||ll>r)
return ans;
if(ll<=l&&r<=rr)
return tr[spc].sum;
int mid=(l+r)>>;
pushdown(spc);
return query(l,mid,ll,rr,lll)+query(mid+,r,ll,rr,rrr);
}
int main()
{
sta.s[][]=;
sta.s[][]=;
pro.s[][]=;
pro.s[][]=;
pro.s[][]=;
read(n);
read(m);
for(register int i=;i<=n;i++)
scanf("%d",&a[i]);
build(,n,);
while(m--)
{
ixt opt;
read(opt);
if(opt==)
{
ixt l,r,x;
read(l);
read(r);
read(x);
if(!x)
continue;
squ tmp=pro^x;
update(,n,l,r,,tmp);
}else{
ixt l,r;
read(l);
read(r);
printf("%I64u\n",(query(,n,l,r,).s[][]%mod+mod)%mod);
}
}
return ;
}
Codeforces 718C. Sasha and Array(线段树)的更多相关文章
- codeforces 719E E. Sasha and Array(线段树)
题目链接: E. Sasha and Array time limit per test 5 seconds memory limit per test 256 megabytes input sta ...
- 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 ...
- 【Codeforces718C】Sasha and Array 线段树 + 矩阵乘法
C. Sasha and Array time limit per test:5 seconds memory limit per test:256 megabytes input:standard ...
- CodeForces 718C Sasha and Array
线段树. 线段树维护区间矩阵和,操作都是最简单的线段树.$lazy$标记不要记录乘了几次,直接记录乘了几次之后的矩阵就可以了,不然每次下传的时候再算一遍时间复杂度会提高. #pragma commen ...
- CF719E. Sasha and Array [线段树维护矩阵]
CF719E. Sasha and Array 题意: 对长度为 n 的数列进行 m 次操作, 操作为: a[l..r] 每一项都加一个常数 C, 其中 0 ≤ C ≤ 10^9 求 F[a[l]]+ ...
- CF718C Sasha and Array 线段树+矩阵加速
正解:线段树 解题报告: 传送门! 首先这种斐波拉契,又到了1e9的范围,又是求和什么的,自然而然要想到矩阵加速昂 然后这里主要是考虑修改操作,ai+=x如果放到矩阵加速中是什么意思呢QAQ? 那不就 ...
- 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}\) 然后又因为 ...
- Codeforces 719 E. Sasha and Array (线段树+矩阵运算)
题目链接:http://codeforces.com/contest/719/problem/E 题意:操作1将[l, r] + x; 操作2求f[l] + ... + f[r]; 题解:注意矩阵可以 ...
随机推荐
- UE4的JSON读写方式<一>
声明:全部权利保留. 转载必须说明出处:http://blog.csdn.net/cartzhang/article/details/41009343 UE4的Json的解析博客地址: http:// ...
- 25.内置API
转自:https://www.cnblogs.com/best/tag/Angular/ 3.1.数据转换 示例: 默认情况JavaScript中对象是传引用的: var tom={name:&quo ...
- AngularJS初接触
todo.json [ { "action": "Buy Flowers", "done": false }, { "action ...
- UVALive - 6266 Admiral 费用流
UVALive - 6266 Admiral 题意:找两条完全不相交不重复的路使得权值和最小. 思路:比赛的时候时间都卡在D题了,没有仔细的想这题,其实还是很简单的,将每个点拆开,连一条容量为1,费用 ...
- 海思平台服务器版软件V15.2产品发布
深度操作系统海思平台服务器版软件是武汉深之度科技有限公司发布的针对华为海思平台的TaiShan系列服务器发布的企业级服务器操作系统软件产品,主要面向企业级服务器应用场景,为用户在国产化平台上提供更具可 ...
- 36Kr众筹项目比呀比biyabi,调查分析研究报告,背后资方势力的关系梳理
36Kr众筹项目比呀比biyabi调查报告 个层次的评价. 变革家-比呀比拆解报告:http://biangejia.com/archives/12653 8.其它 没有通过微信,参加路演,有点遗 ...
- CocoaPods制作
欢迎相同喜欢动效的工程师/UI设计师/产品添加我们 iOS动效特攻队–>QQ群:547897182 iOS动效特攻队–>熊熊:648070256 引言: 折腾了三四天,各种文章翻遍了,遇到 ...
- grunt yoman bower的理解
grunt : 前端构建工具 1 什么事前端构建工具 目前前端已经开始了工程化 比如 一个项目 里面用到了几十个js文件 几十个css 很多图片资源 我们如果引入 还是按照以前的方式 out 因此这个 ...
- ble_app_hrs心率程序 nrf51822
所用程序为: H:\keil\ARM\Device\Nordic\nrf51822\Board\pca10001\s110\ble_app_hrs 上面的路径是安装sdk之后生成在keil软件所在目录 ...
- Ansible学习记录一:Linux下部署
0.Ansible介绍 Ansible 是一个简单的自动化运维管理工具,可以用来自动化部署应用.配置.编排 task(持续交付.无宕机更新等),采用 paramiko 协议库(fabric 也使用这个 ...