线段树。

线段树维护区间矩阵和,操作都是最简单的线段树。$lazy$标记不要记录乘了几次,直接记录乘了几次之后的矩阵就可以了,不然每次下传的时候再算一遍时间复杂度会提高。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<bitset>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-;
void File()
{
freopen("D:\\in.txt","r",stdin);
freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
char c=getchar(); x=;
while(!isdigit(c)) c=getchar();
while(isdigit(c)) {x=x*+c-''; c=getchar();}
} int mod=1e9+;
const int maxn=;
struct Matrix
{
int A[][]; int R,C;
}s[*maxn],t[*maxn];
int n,m;
Matrix Q,Z,P; Matrix ch(Matrix a,Matrix b)
{
Matrix c;
int i, j, k;
for (i = ; i <= a.R; i++)
for (j = ; j <= b.C; j++){
c.A[i][j]=;
for (k = ; k <= a.C; k++){
LL aa=(LL)a.A[i][k],bb=(LL)b.A[k][j];
LL cc=aa*bb%(LL)mod;
int dd=(int)cc;
c.A[i][j] = (c.A[i][j] + dd)%mod;
}
}
c.R=a.R; c.C=b.C;
return c;
} Matrix pow(LL p)
{
Matrix X,Y; X.R=; X.C=; Y.R=; Y.C=; Y.A[][]=; Y.A[][]=;
Y.A[][]=; Y.A[][]=; X.A[][]=; X.A[][]=;
X.A[][]=; X.A[][]=; while (p)
{
if (p % == ) Y = ch(Y,X);
p = p >> ;
X = ch(X,X);
}
return Y;
} void pushUp(int rt)
{
s[rt].R=; s[rt].C=;
s[rt].A[][]=(s[*rt].A[][]+s[*rt+].A[][])%mod;
s[rt].A[][]=(s[*rt].A[][]+s[*rt+].A[][])%mod;
s[rt].A[][]=(s[*rt].A[][]+s[*rt+].A[][])%mod;
s[rt].A[][]=(s[*rt].A[][]+s[*rt+].A[][])%mod;
} bool check(Matrix x)
{
if(x.A[][]!=) return ;
if(x.A[][]!=) return ;
if(x.A[][]!=) return ;
if(x.A[][]!=) return ;
return ;
} void pushDown(int rt)
{
if(check(t[rt])==) return; s[*rt]=ch(s[*rt],t[rt]); t[*rt]=ch(t[*rt],t[rt]);
s[*rt+]=ch(s[*rt+],t[rt]); t[*rt+]=ch(t[*rt+],t[rt]); t[rt].A[][]=; t[rt].A[][]=;
t[rt].A[][]=; t[rt].A[][]=;
} void build(int l,int r,int rt)
{
t[rt].A[][]=; t[rt].A[][]=;
t[rt].A[][]=; t[rt].A[][]=;
t[rt].R=; t[rt].C=; if(l==r)
{
LL x; scanf("%lld",&x); s[rt].R=; s[rt].C=;
s[rt].A[][]=; s[rt].A[][]=;
s[rt].A[][]=; s[rt].A[][]=; s[rt]=ch(s[rt],pow(x-));
return;
} int m=(l+r)/;
build(l,m,*rt);
build(m+,r,*rt+);
pushUp(rt);
} void update(int L,int R,LL x,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
s[rt]=ch(s[rt],P);
t[rt]=ch(t[rt],P);
return ;
} int m=(l+r)/;
pushDown(rt);
if(L<=m) update(L,R,x,l,m,*rt);
if(R>m) update(L,R,x,m+,r,*rt+);
pushUp(rt);
} void add(Matrix a)
{
Q.A[][]=(Q.A[][]+a.A[][])%mod;
Q.A[][]=(Q.A[][]+a.A[][])%mod;
Q.A[][]=(Q.A[][]+a.A[][])%mod;
Q.A[][]=(Q.A[][]+a.A[][])%mod;
} void get(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R) { add(s[rt]); return ; } int m=(l+r)/;
pushDown(rt);
if(L<=m) get(L,R,l,m,*rt);
if(R>m) get(L,R,m+,r,*rt+);
pushUp(rt);
} int main()
{
scanf("%d%d",&n,&m);
build(,n,);
for(int i=;i<=m;i++)
{
int op; scanf("%d",&op);
int L,R; scanf("%d%d",&L,&R);
if(op==)
{
LL x; scanf("%lld",&x);
P=pow(x); update(L,R,x,,n,);
}
else
{
Q.R=; Q.C=; memset(Q.A,,sizeof Q.A);
get(L,R,,n,);
Z.R=; Z.C=; Z.A[][]=; Z.A[][]=;
Z=ch(Z,Q);
printf("%d\n",Z.A[][]);
}
}
return ;
}

CodeForces 718C Sasha and Array的更多相关文章

  1. Codeforces 718C. Sasha and Array(线段树)

    传送门 解题思路: 这道题给了我们一个崭新的角度来看线段树. 我们常常使用的线段树是维护区间的函数的. 这里呢,提示我们线段树其实还可以维护递推. 美好的矩阵递推性质支持了这一功能. 或者说,对于递推 ...

  2. 718C Sasha and Array

    传送门 题目 Sasha has an array of integers a1, a2, ..., an. You have to perform m queries. There might be ...

  3. [CF 718C] Sasha and Array

    传送门 Solution 用线段树维护矩阵 第一个操作相当于区间乘 第二个操作相当于区间求和 Code  #include<bits/stdc++.h> #define ll long l ...

  4. 【codeforces 718 C&D】C. Sasha and Array&D. Andrew and Chemistry

    C. Sasha and Array 题目大意&题目链接: http://codeforces.com/problemset/problem/718/C 长度为n的正整数数列,有m次操作,$o ...

  5. 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 ...

  6. codeforces 719E E. Sasha and Array(线段树)

    题目链接: E. Sasha and Array time limit per test 5 seconds memory limit per test 256 megabytes input sta ...

  7. Codeforces Round #373 (Div. 2) E. Sasha and Array 矩阵快速幂+线段树

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

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

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

  9. Codeforces 442C Artem and Array(stack+贪婪)

    题目连接:Codeforces 442C Artem and Array 题目大意:给出一个数组,每次删除一个数.删除一个数的得分为两边数的最小值,假设左右有一边不存在则算作0分. 问最大得分是多少. ...

随机推荐

  1. MVC无刷新分页

    MVC无刷新分页(即局部刷新,带搜索,页数选择,排序功能)   我查看了很多网站,大部分评论分页都是局部刷新的,可大部分电商商品展示分页都是有刷新页面的,于是我便做了一个商品展示无刷新分页的例子.接下 ...

  2. 从Http它被连接到WebSocket

    1.HTTP协议长期-fi支持和各支持的浏览器 http://blog.csdn.net/fenglibing/article/details/7100222 2.WEBclient与服务端信息交互的 ...

  3. 如何使用SetTimer MFC 不够具体

    转会:http://blog.csdn.net/ellor/article/details/1714741 Timer事件,即定时器事件,是在游戏编程中.常常使用的一个事件.借助它能够产生定时运行动作 ...

  4. .net平台下socket异步通讯(代码实例)

    你应该知道的.net平台下socket异步通讯(代码实例) 1,首先添加两个windows窗体项目,一个作为服务端server,一个作为客户端Client 2,然后添加服务端代码,添加命名空间,界面上 ...

  5. ScriptCase升级到7.01

    今天打开ScriptCase的开发环境,发现有新的升级,联网自动升级后,发现已经升级到7.01版本. 7.01版本对界面进行了优化,菜单和图标均以立体的形式进行展现. 不过粗粗看了一下,翻译还是有很多 ...

  6. Dynamics CRM 2013 体验

    CRM 2013终于可以下载了,赶紧下载安装. 在CRM 2011 的基础上,CRM 2013 在UI上有了很大的变化.从CRM 2011 RollUp 12开始,微软就放弃了按钮的立体效果,逐渐趋向 ...

  7. C#自定义配置文件节点

    老实说,在以前没写个自定义配置节点之前,我都是写到一个很常用的节点里面,就是appSettings里add,然后再对各个节点的value值进行字符串分割操作,根据各种分割字符嵌套循环处理,后来看到一些 ...

  8. 最短路模板[spfa][dijkstra+堆优化][floyd]

    借bzoj1624练了一下模板(虽然正解只是floyd) spfa: #include <cstdio> #include <cstring> #include <alg ...

  9. 在VMware的Linux系统上安装Redis

    在VMware的Linux系统上安装Redis 具体过程如下: 下载,解压和编译: 在执行make的时候报错,具体报错信息如下: zmalloc.o: In function `zmalloc_use ...

  10. Dotliquid使用Json模板变量

    Dotliquid是不错的Template Engine,为了更方便使用,扩展了一下,使它支持json数据的替换,引用了Newtonsoft.Json.Linq /// <summary> ...