线段树。

线段树维护区间矩阵和,操作都是最简单的线段树。$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. sql datalength与len区别用法

    原文:sql datalength与len区别用法 len ( string_expression )参数:要计算的字符串 len() 函数len 函数返回文本字段中值的长度. sql len() 语 ...

  2. 必须掌握的JavaScript基本知识

    作为一个前端工作者,应该了解一些javascript的发展历史,javascript实现及版本等.基本概念包括语法.关键字.变量.数据类型.操作符.语句控制及函数等,它们和我们学习的其它语言C/C++ ...

  3. 我的Android 4 学习系列之Intent 和 Broadcast Reciever

    目录 Intent 简介 使用隐式和显式Intent启动Activity.子Acitivity和Service 使用Linkify 使用Broadcast Intent 广播事件 使用 Pending ...

  4. SQL Server查看表结构及视图,适合开发者使用,简单易用

    SELECT * FROM INFORMATION_SCHEMA.TABLES SELECT * FROM INFORMATION_SCHEMA.COLUMNS 查看执行结果

  5. 基于MEF的插件框架之总体设计

    基于MEF的插件框架之总体设计 1.MEF框架简介 MEF的全称是Managed Extensibility Framework(MEF),其是.net4.0的组成部分,在3.5上也可以使用.熟悉ja ...

  6. EF codefirst+mvc4+bootstrap+autofac+ddd 系统共享 祝大家新年开心搬砖

    博客园的博友新年好,小弟在此给大伙拜了晚年,感谢一直以来的支持. 在过去的一年,从博客园有400多ASP.NET MVC爱好者加入本人的群,本人在此很感激,并勉励大家一起学习奋斗. 希望在新的一年,继 ...

  7. Linq无聊练习系列6--Any/All/Contains/Concat/Union/Intersect/Except/take/skip/SqlMethods操作练习

    /*********************Any/All/Contains/Concat/Union/Intersect/Except/take/skip/SqlMethods操作练习******* ...

  8. .NET:线程本地存储、调用上下文、逻辑调用上下文

    .NET:线程本地存储.调用上下文.逻辑调用上下文 目录 背景线程本地存储调用上下文逻辑调用上下文备注 背景返回目录 在多线程环境,如果需要将实例的生命周期控制在某个操作的执行期间,该如何设计?经典的 ...

  9. iOS手动管理内存

    虽然iOS已经有了ARC帮你自动管理内存,但在有些项目中必须采用手动的方式,而且在懂得手动管理内存的情况下会是自己的代码更加完善 众所周知,基于手动管理内存的情况下必然涉及到 relese  reta ...

  10. OpenCascade简介

    OpenCascade简介   Overview of OpenCascade Library eryar@163.com 摘要Abstract:对OpenCascade库的功能及其实现做简要介绍. ...