CF719E. Sasha and Array [线段树维护矩阵]
CF719E. Sasha and Array
题意:
对长度为 n 的数列进行 m 次操作, 操作为:
- a[l..r] 每一项都加一个常数 C, 其中 0 ≤ C ≤ 10^9
- 求 F[a[l]]+F[a[l+1]]+...F[a[r]] mod 1e9+7 的余数
矩阵快速幂求斐波那契
矩阵满足乘法分配律和结合律!
所以可以每个节点维护矩阵/矩阵和,区间加相当于区间乘矩阵
注意:不要把快速幂写在里面,复杂度平添一个log。把\(B^C\)算出来之后传进去就好了
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
#define lc x<<1
#define rc x<<1|1
#define mid ((l+r)>>1)
#define lson lc, l, mid
#define rson rc, mid+1, r
const int N = 1e5+5, P = 1e9+7;
int n, m;
struct Matrix {
ll a[2][2];
ll* operator [](int x) {return a[x];}
Matrix(int p=0) {
if(!p) a[0][0] = a[0][1] = a[1][0] = a[1][1] = 0;
else a[0][0] = a[1][1] = 1, a[0][1] = a[1][0] = 0;
}
} B;
Matrix operator + (Matrix a, Matrix b) {
Matrix c;
for(int i=0; i<2; i++)
for(int j=0; j<2; j++)
c[i][j] = (a[i][j] + b[i][j]) %P;
return c;
}
Matrix operator * (Matrix a, Matrix b) {
Matrix c;
for(int i=0; i<2; i++)
for(int j=0; j<2; j++) {
ll &x = c[i][j];
for(int k=0; k<2; k++)
x = (x + a[i][k] * b[k][j] %P) %P;
}
return c;
}
Matrix operator ^ (Matrix a, int b) {
Matrix ans(1);
ans[0][0] = ans[1][1] = 1;
for(; b; b>>=1, a=a*a)
if(b & 1) ans = ans*a;
return ans;
}
struct meow {
Matrix f;
Matrix v;
int c;
meow() {f[0][0] = 1; v[0][0] = v[1][1] = 1;}
} t[N<<2];
void paint(int x, int l, int r, int d, Matrix &v) {
t[x].c += d;
t[x].v = v * t[x].v;
t[x].f = v * t[x].f;
}
void push_down(int x, int l, int r) {
if(t[x].c) {
paint(lson, t[x].c, t[x].v);
paint(rson, t[x].c, t[x].v);
t[x].c = 0;
t[x].v = Matrix(1);
}
}
void merge(int x) {
t[x].f = t[lc].f + t[rc].f;
}
void build(int x, int l, int r) {
if(l == r) {
cin >> t[x].c;
if(t[x].c > 1) t[x].f = (B ^ (t[x].c - 1)) * t[x].f;
} else {
build(lson);
build(rson);
merge(x);
}
}
void Add(int x, int l, int r, int ql, int qr, int d, Matrix &v) {
if(ql <= l && r <= qr) paint(x, l, r, d, v);
else {
push_down(x, l, r);
if(ql <= mid) Add(lson, ql, qr, d, v);
if(mid < qr) Add(rson, ql, qr, d,v );
merge(x);
}
}
ll Que(int x, int l, int r, int ql, int qr) {
if(ql <= l && r <= qr) return t[x].f[0][0];
else {
push_down(x, l, r);
ll ans = 0;
if(ql <= mid) ans = (ans + Que(lson, ql, qr)) %P;
if(mid < qr) ans = (ans + Que(rson, ql, qr)) %P;
return ans;
}
}
int main() {
//freopen("in", "r", stdin);
ios::sync_with_stdio(false); cin.tie(); cout.tie();
B[0][0] = B[0][1] = B[1][0] = 1;
cin >> n >> m;
build(1, 1, n);
for(int i=1; i<=m; i++) {
int tp, l, r, x;
cin >> tp >> l >> r;
if(tp == 1) {
cin >> x;
Matrix t = B^x;
Add(1, 1, n, l, r, x, t);
} else cout << Que(1, 1, n, l, r) << '\n';
}
CF719E. 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 ...
- 线段树维护矩阵【CF718C】 Sasha and Array
Description 有一个长为\(n\)的数列\(a_{1},a_{2}...a_{n}\),你需要对这个数列维护如下两种操作: \(1\space l \space r\space x\) 表示 ...
- CF718C Sasha and Array(线段树维护矩阵)
题解 (不会矩阵加速的先去学矩阵加速) 反正我想不到线段树维护矩阵.我太菜了. 我们在线段树上维护一个区间的斐波那契的列矩阵的和. 然后询问时提取每个符合题意列矩阵的答案项(不是列矩阵存了两项吗,一个 ...
- 【Codeforces718C】Sasha and Array 线段树 + 矩阵乘法
C. Sasha and Array time limit per test:5 seconds memory limit per test:256 megabytes input:standard ...
- Subsequence Count 2017ccpc网络赛 1006 dp+线段树维护矩阵
Problem Description Given a binary string S[1,...,N] (i.e. a sequence of 0's and 1's), and Q queries ...
- hdu 5068 线段树维护矩阵乘积
http://acm.hdu.edu.cn/showproblem.php?pid=5068 题意给的略不清晰 m个询问:从i层去j层的方法数(求连段乘积)或者修改从x层y门和x+1层z门的状态反转( ...
- Codeforces 1368H - Breadboard Capacity(最小割+线段树维护矩阵乘法)
Easy version:Codeforces 题面传送门 & 洛谷题面传送门 Hard version:Codeforces 题面传送门 & 洛谷题面传送门 首先看到这种从某一种颜色 ...
- Codeforces 750E - New Year and Old Subsequence(线段树维护矩阵乘法,板子题)
Codeforces 题目传送门 & 洛谷题目传送门 u1s1 我做这道 *2600 的动力是 wjz 出了道这个套路的题,而我连起码的思路都没有,wtcl/kk 首先考虑怎样对某个固定的串计 ...
- CF718C Sasha and Array 线段树 + 矩阵乘法
有两个操作: 将 $[l,r]$所有数 + $x$ 求 $\sum_{i=l}^{r}fib(i)$ $n=m=10^5$ 直接求不好求,改成矩阵乘法的形式: $a_{i}=M^x\times ...
随机推荐
- (一)初探Maven之本地安装与配置本地仓库
引言: 大多数IDE都会自带maven,如果你打开c盘用户目录,你会看到一个.m2文件这就是编译器自带maven的仓库父目录,但由于其在C盘和其他原因,一般我们会自己重新安装mave ...
- java构造方法的重载
package test; public class Person { String name; int age; public Person() { System.out.println(" ...
- 【5】学习C++之类的概念
C++ 中的类(Class)可以看做C语言中结构体(Struct)的升级版.结构体是一种构造类型,可以包含若干成员变量,每个成员变量的类型可以不同:可以通过结构体来定义结构体变量,每个变量拥有相同的性 ...
- 分享一个在线生成微信跳转链接实现微信内跳转浏览器打开URL的工具
前言 现如今微信对第三方推广链接的审核是越来越严格了,域名在微信中分享转发经常会被拦截,一旦被拦截用户就只能复制链接手动打开浏览器粘贴才能访问,要不然就是换个域名再推,周而复始.无论是哪一种情况都会面 ...
- java 数组中的方法
//要import java.util.Arrays: fill(int[] a,int value);//对a数组进行全部用value填充 fill(int[] a,int fromIndex,in ...
- Numerical Analysis
PART1 <求解方程> 1,二分法 def bisect(f,a,b,TOL=0.000004): u_a = a u_b = b while(u_b-u_a)/2.0 > TO ...
- 在django admin中添加自定义视图
来自https://blog.csdn.net/qq_35753140/article/details/84881757 django admin提供了完善的用户管理和数据模型管理,方便实用.研究 ...
- [HTTP]POST报文中Content-Type对正文解析的影响
概述 在POST请求中,理论上请求端程序可以发送任意格式报文正文,但是最好在报文头Content-Type字段标明正文的格式,方便接收端根据Content-Type正确处理正文. 传统HTML-for ...
- maven父子模块deploy 问题
1.问题描述:直接 deploy 子某块,但第三者确不能引用 jar(jar down不下来,但pom不报错) 原因:父子模块项目必须保证父模块pom deploy后,再 deploy 子模块才能被引 ...
- Spring中@Component注解,@Controller注解详解
在使用Spring的过程中,为了避免大量使用Bean注入的Xml配置文件,我们会采用Spring提供的自动扫描注入的方式,只需要添加几行自动注入的的配置,便可以完成 Service层,Controll ...