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 ...
随机推荐
- Technocup 2019 - Elimination Round 2
http://codeforces.com/contest/1031 (如果感觉一道题对于自己是有难度的,不要后退,懂0%的时候敲一遍,边敲边想,懂30%的时候敲一遍,边敲边想,懂60%的时候敲一遍, ...
- Node的express配置使用ejs模板
注册ejs模板为html页.以.ejs为后缀的模板页,现在的后缀名可以是.html app.engine('.html', require('ejs').__express); 设置视图模板的默认后缀 ...
- PLSQL Developer 没有64位版本 + 找不到 msvcr71.dll
由于 PLSQL Developer 没有64位版本,所以在64位系统上运行该程链接64位Oracle时就会报错,笔者为这个问题纠结了好几天,后来通过请教Google + 动手实践,终于搞定了这个问题 ...
- Python:匿名函数lambda的函数用法和排序用法
一.介绍: Lambda函数,是一个匿名函数,创建语法: lambda parameters:express parameters:可选,如果提供,通常是逗号分隔的变量表达式形式,即位置参数. exp ...
- python - Excel表格
from openpyxl import load_workbook wb = load_workbook(r'C:\Users\admin\Desktop\数据筛选.xlsx') # print(w ...
- mysql linux utf-8 下中文乱码
SET character_set_client='utf8'; SET character_set_connection='utf8'; SET character_set_results='utf ...
- java操作mongodb & springboot整合mongodb
简单的研究原生API操作MongoDB以及封装的工具类操作,最后也会研究整合spring之后作为dao层的完整的操作. 1.原生的API操作 pom.xml <!-- https://mvnre ...
- Python规范
1.命名 Django文件命名 小写+下划线 类:驼峰 2.edit 执行环境 work direction 到当前项目目录 3.类要加注释 4.去数据库找数据时需要try捕获异常,防止数据库连接断掉 ...
- python日志重复输出
在学习了python的函数式编程后,又接触到了logging这样一个强大的日志模块.为了减少重复代码,应该不少同学和我一样便迫不及待的写了一个自己的日志函数,比如下面这样: # 这里为了便于理解, ...
- The base and high address of the custom IP are not correctly reflected in xparameters.h in SDK
This issue has been observed in 2015.3, 2015.4, and 2015.4.1 builds of Vivado. When you create and a ...