E. Sasha and Array

这个题目没有特别难,需要自己仔细想想,一开始我想了一个方法,不对,而且还很复杂,然后lj提示了我一下说矩阵乘,然后再仔细想想就知道怎么写了。

这个就是直接把矩阵放到线段树里面去了。

注意优化,降低复杂度。

#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <queue>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int mod=1e9+;
struct mat
{
ll m[][];
}unite,zero; mat operator*(mat a,mat b){
mat ans;
for(int i=;i<=;i++){
for(int j=;j<=;j++){
ll x = ;
for(int k=;k<=;k++) x+=(a.m[i][k]*b.m[k][j])%mod;
ans.m[i][j]=x%mod;
}
}
return ans;
}
mat operator+(mat a,mat b){
mat ans;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
ans.m[i][j]=(a.m[i][j]+b.m[i][j])%mod;
return ans;
} mat mod_pow(mat a,ll n){
mat ans=unite;
while(n){
if(n&) ans=ans*a;
a=a*a;
n>>=;
}
return ans;
} const int maxn=1e5+;
mat sum[maxn*],a,lazy[maxn*];
ll v[maxn]; void init(){
a.m[][]=a.m[][]=a.m[][]=,a.m[][]=;
for(int i=;i<;i++) unite.m[i][i]=;
for(int i=;i<;i++)
for(int j=;j<;j++) zero.m[i][j]=;
} void push_up(int id){
sum[id]=sum[id<<]+sum[id<<|];
} void build(int id,int l,int r){
lazy[id]=unite;
if(l==r){
sum[id]=mod_pow(a,v[l]);
return ;
}
int mid=(l+r)>>;
build(id<<,l,mid);
build(id<<|,mid+,r);
push_up(id);
} bool same(mat a,mat b){
for(int i=;i<=;i++){
for(int j=;j<=;j++){
if(a.m[i][j]!=b.m[i][j]) return false;
}
}
return true;
} void push_down(int id){
if(same(lazy[id],unite)) return ;
sum[id<<]=sum[id<<]*lazy[id];
sum[id<<|]=sum[id<<|]*lazy[id];
lazy[id<<]=lazy[id<<]*lazy[id];
lazy[id<<|]=lazy[id<<|]*lazy[id];
lazy[id]=unite;
} void update(int id,int l,int r,int x,int y,mat val){
if(x<=l&&y>=r){
lazy[id]=lazy[id]*val;
sum[id]=sum[id]*val;
return ;
}
push_down(id);
int mid=(l+r)>>;
if(x<=mid) update(id<<,l,mid,x,y,val);
if(y>mid) update(id<<|,mid+,r,x,y,val);
push_up(id);
} mat query(int id,int l,int r,int x,int y){
if(x<=l&&y>=r) return sum[id];
mat ans=zero;
int mid=(l+r)>>;
push_down(id);
if(x<=mid) ans=ans+query(id<<,l,mid,x,y);
if(y>mid) ans=ans+query(id<<|,mid+,r,x,y);
return ans;
} int main(){
init();
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%lld",&v[i]);
build(,,n);
while(m--){
int opt;
ll l,r,x;
scanf("%d",&opt);
if(opt==){
scanf("%lld%lld%lld",&l,&r,&x);
mat val=mod_pow(a,x);
update(,,n,l,r,val);
}
else {
scanf("%lld%lld",&l,&r);
mat ans=query(,,n,l,r);
printf("%lld\n",ans.m[][]);
}
}
return ;
}

E. Sasha and Array 矩阵快速幂 + 线段树的更多相关文章

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

  2. Codeforces 719E [斐波那契区间操作][矩阵快速幂][线段树区间更新]

    /* 题意:给定一个长度为n的序列a. 两种操作: 1.给定区间l r 加上某个数x. 2.查询区间l r sigma(fib(ai)) fib代表斐波那契数列. 思路: 1.矩阵操作,由矩阵快速幂求 ...

  3. 【XSY2524】唯一神 状压DP 矩阵快速幂 FFT

    题目大意 给你一个网格,每个格子有概率是\(1\)或是\(0\).告诉你每个点是\(0\)的概率,求\(1\)的连通块个数\(\bmod d=0\)的概率. 最开始所有格子的概率相等.有\(q\)次修 ...

  4. Wannafly Winter Camp 2019.Day 8 div1 E.Souls-like Game(线段树 矩阵快速幂)

    题目链接 \(998244353\)写成\(99824435\)然后调这个线段树模板1.5h= = 以后要注意常量啊啊啊 \(Description\) 每个位置有一个\(3\times3\)的矩阵, ...

  5. 线段树+矩阵快速幂 Codeforces Round #373 (Div. 2) E

    http://codeforces.com/contest/719/problem/E 题目大意:给你一串数组a,a[i]表示第i个斐波那契数列,有如下操作 ①对[l,r]区间+一个val ②求出[l ...

  6. CF575A Fibonotci [线段树+矩阵快速幂]

    题意 \(s\{\}\) 是一个循环数列 循环节为 \(n\),你可以改掉 \(m\) 项,这 \(m\) 项独立,且不影响循环节 考虑线段树维护矩阵,单点修改最多m次,每次矩阵快速幂就完事了 // ...

  7. hdu4965 Fast Matrix Calculation (矩阵快速幂 结合律

    http://acm.hdu.edu.cn/showproblem.php?pid=4965 2014 Multi-University Training Contest 9 1006 Fast Ma ...

  8. hdu 4291 2012成都赛区网络赛 矩阵快速幂 ***

    分析:假设g(g(g(n)))=g(x),x可能非常大,但是由于mod 10^9+7,所以可以求出x的循环节 求出x的循环节后,假设g(g(g(n)))=g(x)=g(g(y)),即x=g(y),y也 ...

  9. 瓷砖铺放 (状压DP+矩阵快速幂)

    由于方块最多涉及3行,于是考虑将每两行状压起来,dfs搜索每种状态之间的转移. 这样一共有2^12种状态,显然进行矩阵快速幂优化时会超时,便考虑减少状态. 进行两遍bfs,分别为初始状态可以到达的状态 ...

随机推荐

  1. 结束基础,开始MVC之旅!

    今天终于把前端Extjs和基础折腾完,虽然每一个都只是实现一个小的实例,但是也算是把.NET基础和前端基础顺了一遍.也算是提升.不足就是高级的知识点并没有吃透,比如委托,lamda之类的,还得在后面的 ...

  2. BeanShell计算支付价格

    问题:需要获取支付价格,而支付价格是商品价格*折扣 解决:先将商品价格和折扣获取出来,然后使用BeanShell将两个值相乘,获得最后的支付价格 1.使用json提取器提取商品的价格 2.使用正则表达 ...

  3. Jmeter命令行执行并生成HTML报告

    前提:准备好jmeter脚本,找到jmeter配置文件查看生成的日志格式是否为csv,如果不是请改为csv 注意:使用命令执行jmeter脚本必须使用jmeter 3.0及以上版本1.使用命令行执行脚 ...

  4. python这门语言为什么要起这个名字

    我只是一只可爱的小虫 前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:Liz喵 PS:如有需要Python学习资料的小 ...

  5. Python - 实现文件名自动更改,避免同名文件被覆盖的两个解决方法

    [原创]转载请注明作者Johnthegreat和本文链接. 在一些不多的数据下载和生成的时候,我们倾向于直接保存为文件,当我们修改某些参数后再一次运行时,之前运行时生成的文件就被覆盖了.为了解决这个问 ...

  6. VMware15 安装Mac 10.14系统/苹果系统

    安装环境 Windows专业版 VMware Workstation Pro 15 所需资源 VMware Workstation Pro 15.0.0 Build 10134415 官网下载地址:h ...

  7. SpringCloud-Config 配置中心

    概述 分布式系统面临的问题 微服务意味着要将单体应用中的业务拆分成一个个的子服务,这些服务都需要必要的配置信息才能运行,如果有上百个微服务,上百个配置文件,管理起来是非常困难的,这时候,一套集中式的. ...

  8. pytorch-API实现线性回归

    示例: import torch import torch.nn as nn from torch import optim class MyModel(nn.Module): def __init_ ...

  9. python爬虫——用selenium爬取京东商品信息

    1.先附上效果图(我偷懒只爬了4页)  2.京东的网址https://www.jd.com/ 3.我这里是不加载图片,加快爬取速度,也可以用Headless无弹窗模式 options = webdri ...

  10. 超详细步骤---Linux下的最新Git版本安装

    原文地址:https://blog.csdn.net/u010887744/article/details/53957613 [标注大头] 1.查看当前git版本:git --version 查看最新 ...