[CF 718C] Sasha and Array
传送门
Solution
用线段树维护矩阵
第一个操作相当于区间乘
第二个操作相当于区间求和
Code
#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
#define mod 1000000007
#define MN 100005
#define mid ((l+r)>>1)
int n,m;
struct matrix
{
ll a[2][2];
matrix(){memset(a,0,sizeof a);}
matrix operator *(const matrix &b) const
{
register matrix c;register int i,j,k;
for(i=0;i<2;++i)for(j=0;j<2;j++)for(k=0;k<2;++k)
(c.a[i][j]+=b.a[i][k]*a[k][j]%mod)%=mod;
return c;
}
matrix operator +(const matrix &b) const
{
register matrix c;register int i,j;
for(i=0;i<2;++i)for(j=0;j<2;++j) c.a[i][j]=(b.a[i][j]+a[i][j])%mod;
return c;
}
}tmp,xxx,t[MN<<2],lazy[MN<<2],orig,pro,unit;
void fpow(int x)
{
for(tmp=unit,xxx=pro;x;x>>=1,xxx=xxx*xxx) if(x&1) tmp=tmp*xxx;
}
void print(matrix x)
{
for(int i=0;i<2;++i)
{
for(int j=0;j<2;++j) printf("%d ",x.a[i][j]);
puts("");
}
puts("");
}
inline void pushdown(int x)
{
t[x<<1]=t[x<<1]*lazy[x];t[x<<1|1]=t[x<<1|1]*lazy[x];
lazy[x<<1]=lazy[x<<1]*lazy[x];lazy[x<<1|1]=lazy[x<<1|1]*lazy[x];
lazy[x]=unit;
}
void build(int x,int l,int r)
{
if(l==r){fpow(read()-1),t[x]=orig*tmp,lazy[x]=unit;return;}
build(x<<1,l,mid);build(x<<1|1,mid+1,r);
t[x]=t[x<<1]+t[x<<1|1];lazy[x]=unit;
}
matrix query(int x,int l,int r,int a,int b)
{
if(a==l&&r==b) return t[x];
pushdown(x);
if(b<=mid) return query(x<<1,l,mid,a,b);
if(a>mid) return query(x<<1|1,mid+1,r,a,b);
return query(x<<1,l,mid,a,mid)+query(x<<1|1,mid+1,r,mid+1,b);
}
void Modify(int x,int l,int r,int a,int b)
{
if(a==l&&b==r){lazy[x]=lazy[x]*tmp,t[x]=t[x]*tmp;return;}
pushdown(x);
if(b<=mid) Modify(x<<1,l,mid,a,b);
else if(a>mid) Modify(x<<1|1,mid+1,r,a,b);
else Modify(x<<1,l,mid,a,mid),Modify(x<<1|1,mid+1,r,mid+1,b);
t[x]=t[x<<1]+t[x<<1|1];
}
int main()
{
unit.a[0][0]=unit.a[1][1]=1;
orig.a[0][0]=1;
pro.a[0][0]=pro.a[0][1]=pro.a[1][0]=1;
n=read(),m=read();
build(1,1,n);
register int type,l,r;
while(m--)
{
type=read();l=read();r=read();
if(type==1) fpow(read()),Modify(1,1,n,l,r);
else printf("%lld\n",query(1,1,n,l,r).a[0][0]);
}
return 0;
}
Blog来自PaperCloud,未经允许,请勿转载,TKS!
[CF 718C] Sasha and Array的更多相关文章
- 718C Sasha and Array
传送门 题目 Sasha has an array of integers a1, a2, ..., an. You have to perform m queries. There might be ...
- CodeForces 718C Sasha and Array
线段树. 线段树维护区间矩阵和,操作都是最简单的线段树.$lazy$标记不要记录乘了几次,直接记录乘了几次之后的矩阵就可以了,不然每次下传的时候再算一遍时间复杂度会提高. #pragma commen ...
- Codeforces 718C. Sasha and Array(线段树)
传送门 解题思路: 这道题给了我们一个崭新的角度来看线段树. 我们常常使用的线段树是维护区间的函数的. 这里呢,提示我们线段树其实还可以维护递推. 美好的矩阵递推性质支持了这一功能. 或者说,对于递推 ...
- 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 719E E. Sasha and Array(线段树)
题目链接: E. Sasha and Array time limit per test 5 seconds memory limit per test 256 megabytes input sta ...
- Sasha and Array
Sasha and Array time limit per test 5 seconds memory limit per test 256 megabytes input standard inp ...
- 【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 ...
- CF719E. Sasha and Array [线段树维护矩阵]
CF719E. Sasha and Array 题意: 对长度为 n 的数列进行 m 次操作, 操作为: a[l..r] 每一项都加一个常数 C, 其中 0 ≤ C ≤ 10^9 求 F[a[l]]+ ...
随机推荐
- 湖南师范大学计算机基础课网络教学平台 版本 V2.0(2017.9.18)
湖南师范大学计算机基础课网络教学平台 版本 V2.0(2017.9.18) 开发环境: 开发工具:VS2013,数据库:Sqlserver2012 开发语言:Asp.net MVC5 ,界面UI:jq ...
- MVC4 部署 could not load file or assembly system.web.http.webhost 或是其它文件出误
自从VS2010发布之后使用它来做开发的程序员越来越多,其中很多人使用了MVC来作为新的开发框架,但是在系统部署的时候我们也遇到诸多问题,因为目前大多数windows服务器采用的还是Windows S ...
- vue-cli脚手架——3.0版本项目案例
一.[准备工作] node与git部分见vue-cli2.0搭建案例 vue-cli3.0是一个基于 Vue.js 进行快速开发的完整系统.有三个组件: CLI:@vue/cli 全局安装的 npm ...
- java web编程 servlet2
一般在开发的过程中主要用一个doGet和doPost方法, http就是超文本传输协议,这是java API对servlet的描述 : 一般我们调用的方法细则如下 : service一分为二reque ...
- 关于maven中版本控制问题
之前我们说过Maven的版本分为快照和稳定版本,快照版本使用在开发的过程中,方便于团队内部交流学习.而所说的稳定版本,理想状态下是项目到了某个比较稳定的状态,这个稳定包含了源代码和构建都要稳定. ma ...
- 日志管理与ftp。samba,nfs
1.描述rsyslog日志服务,并提供带web展示的日志服务器 rsyslog日志服务简介 日志的概念好理解,日志作用可用于排障和追溯审计的等 1.rsyslog是一个C/S架构的服务,可监听 ...
- 7. Input and Output
7. Input and Output There are several ways to present the output of a program; data can be printed i ...
- 漫谈五种IO模型(主讲IO多路复用)
首先引用levin的回答让我们理清楚五种IO模型 1.阻塞I/O模型 老李去火车站买票,排队三天买到一张退票. 耗费:在车站吃喝拉撒睡 3天,其他事一件没干. 2.非阻塞I/O模型 老李去火车站买票, ...
- PAT1016 × PAT1017
本次题解是综合1016和1017两道题来讲解,原因无他,因为这两道都是模拟题,综合字符串处理.排序等考点 接手一道模拟题,一定要快速且准确地了解模拟的过程,清晰题目涉及的关键信息.比如1016要计算电 ...
- 堆(python)
# -*- coding:utf-8 -*- class Array(object): def __init__(self, size=32): self._size = size self._ite ...