http://codeforces.com/contest/719/problem/E

题目大意:给你一串数组a,a[i]表示第i个斐波那契数列,有如下操作

①对[l,r]区间+一个val ②求出[l,r]区间的和。

定义区间的和为该区间内每个a[i]所对应的斐波那契数列的和。

思路:线段树保存区间val,和区间更新,用矩阵快速幂求解复杂度是m*logn*logk

//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define haha printf("haha\n")
const int maxn = 1e5 + ;
const LL mod = 1e9 + ;
struct Node{
LL mat[][];
void reset(){memset(mat, , sizeof(mat));}
void getone(){
reset();
mat[][] = mat[][] = ;
}
}; inline Node mul(Node A, Node B){
Node ans; ans.reset();
for (int i = ; i < ; i++)
for (int j = ; j < ; j++)
for (int k = ; k < ; k++)
ans.mat[i][j] = (ans.mat[i][j] + A.mat[i][k] * B.mat[k][j]) % mod;
return ans;
} inline Node add(Node a, Node b){
Node ans; ans.reset();
for (int i = ; i < ; i++)
for (int j = ; j < ; j++)
ans.mat[i][j] = (a.mat[i][j] + b.mat[i][j]) % mod;
return ans;
} inline Node kpow(LL k){
Node ans; ans.reset();
ans.mat[][] = ans.mat[][] = ;
Node A;
A.mat[][] = A.mat[][] = A.mat[][] = ;
A.mat[][] = ;
while (k){
if (k & ) ans = mul(ans, A);
A = mul(A, A);
k >>= ;
}
return ans;
} struct Mytree{
Node sum;
Node lazyk;
}tree[maxn << ]; int n, m; inline void push_up(int o){
int lb = o << , rb = o << | ;
tree[o].sum = add(tree[lb].sum, tree[rb].sum);
} void build_tree(int l, int r, int o){
if (l == r){
LL k; scanf("%lld", &k);
tree[o].sum = kpow(k);
tree[o].lazyk.getone();
return ;
}
tree[o].sum.reset(); tree[o].lazyk.getone();
int mid = (l + r) / ;
if (l <= mid) build_tree(l, mid, o << );
if (r > mid) build_tree(mid + , r, o << | );
push_up(o);
} inline void push_down(int o){
int lb = o << , rb = o << | ;
tree[lb].sum = mul(tree[lb].sum, tree[o].lazyk);
tree[lb].lazyk = mul(tree[lb].lazyk, tree[o].lazyk); tree[rb].sum = mul(tree[rb].sum, tree[o].lazyk);
tree[rb].lazyk = mul(tree[rb].lazyk, tree[o].lazyk); tree[o].lazyk.getone();
} void update(int l, int r, int ql, int qr, Node k, int o){
if (ql <= l && qr >= r){
tree[o].sum = mul(tree[o].sum, k);
tree[o].lazyk = mul(tree[o].lazyk, k);
return ;
}
int mid = (l + r) / ;
push_down(o);
if (ql <= mid) update(l, mid, ql, qr, k, o << );
if (qr > mid) update(mid + , r, ql, qr, k, o << | );
push_up(o);
return ;
} Node query(int l, int r, int ql, int qr, int o){
if (ql <= l && qr >= r){
return tree[o].sum;
}
push_down(o);
Node ans; ans.reset();
int mid = (l + r) / ;
if (ql <= mid) ans = add(query(l, mid, ql, qr, o << ), ans);
if (qr > mid) ans = add(query(mid + , r, ql, qr, o << | ), ans);
push_up(o);
return ans;
} int main(){
scanf("%d%d", &n, &m);
build_tree(, n, );
for (int i = ; i < m; i++){
int ty; scanf("%d", &ty);
if (ty == ){
int l, r; LL k;
scanf("%d%d%lld", &l, &r, &k);
update(, n, l, r, kpow(k), );
}
else if (ty == ){
int l, r; scanf("%d%d", &l, &r);
Node ans = query(, n, l, r, );
printf("%lld\n", ans.mat[][]);
}
}
return ;
}

线段树+矩阵快速幂 Codeforces Round #373 (Div. 2) E的更多相关文章

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

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

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

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

  3. CF719E(线段树+矩阵快速幂)

    题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...

  4. [快速幂]Codeforces Round #576 (Div. 2)-C. MP3

    C. MP3 time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  5. Codeforces Round #373 (Div. 1)

    Codeforces Round #373 (Div. 1) A. Efim and Strange Grade 题意 给一个长为\(n(n \le 2 \times 10^5)\)的小数,每次可以选 ...

  6. Codeforces Round #373 (Div. 2)A B

    Codeforces Round #373 (Div. 2) A. Vitya in the Countryside 这回做的好差啊,a想不到被hack的数据,b又没有想到正确的思维 = = [题目链 ...

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

  8. [递推+矩阵快速幂]Codeforces 1117D - Magic Gems

    传送门:Educational Codeforces Round 60 – D   题意: 给定N,M(n <1e18,m <= 100) 一个magic gem可以分裂成M个普通的gem ...

  9. 矩阵快速幂---BestCoder Round#8 1002

    当要求递推数列的第n项且n很大时,怎么快速求得第n项呢?可以用矩阵快速幂来加速计算.我们可以用矩阵来表示数列递推公式比如fibonacci数列 可以表示为 [f(n)   f(n-1)] = [f(n ...

随机推荐

  1. 深度学习之卷积神经网络CNN

    转自:https://blog.csdn.net/cxmscb/article/details/71023576 一.CNN的引入 在人工的全连接神经网络中,每相邻两层之间的每个神经元之间都是有边相连 ...

  2. Eclipse 导入项目与 svn 插件关联全过程记录

    文章摘自:http://www.cnblogs.com/xmmcn/archive/2013/03/01/2938365.html 感谢博友分享! Eclipse 导入项目与 svn 插件关联全过程记 ...

  3. Java测试工具和框架

    个人目前只接触过JUnit以及Powermock,后续会关注更多有关测试这方面的东西 8个超实用的Java测试工具和框架_开发/数据库_IT专家网 http://database.ctocio.com ...

  4. spring boot 连接mysql 错误The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one

    1.spring boot 整合mybatis 连接mysql时错误 The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or repr ...

  5. jmeter4.0☞如何汉化(二)

    如何汉化jmeter打开jmeter,选择options_choose language_Chinese(simplified),如下图: 刚刚下载使用jmeter4.0的时候有点懵圈,英语实在是差劲 ...

  6. mysql语法总结

    增: 删: 改: 查: 索引: 建: alter table: sql一些常用的经典语句,最后是select as的用法

  7. 预处理器&预处理变量&头文件保护&条件编译

    [常见的预处理功能] #include 头文件保护符 条件编译 [预处理器] 编译之前执行的一段程序,可以部分地改变我们所写的程序 举个例子:当预处理器看到#include标记时就会用指定的头文件的内 ...

  8. 软工实践Beta冲刺(3/7)

    队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...

  9. linux tcpdump抓包,wireshark实时解析

    转自: http://www.freebuf.com/articles/wireless/6517.html   由于CentOS7上yum安装的wireshark对CoAP的解析支持不太完善,而我w ...

  10. PhalApi 1.4.2 经典封存版 - 码云

    https://www.phalapi.net/ PhalApi 1.x 是经典封存版本,已停止更新,历练考验,可放心使用. 主要采用PEAR命名规范,遵循PSR-0,不支持命名空间和composer ...