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. MSSQL如何查看当前数据库的连接数 【转】

    - [SQL Server]版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://ai51av.blogbus.com/logs/52955622.html   如果我们发布 ...

  2. bzoj 一些题目汇总

    2140: 稳定婚姻 /* 求联通分量. */ #include<bits/stdc++.h> using namespace std; typedef long long LL; inl ...

  3. P1107 最大整数

    P1107 最大整数 题目描述 设有n个正整数 (n<=20), 将它们连接成一排, 组成一个最大的多位整数. 例如: n=3时, 3个整数13, 312, 343连接成的最大整数为: 3433 ...

  4. 详解jQuery中 .bind() vs .live() vs .delegate() vs .on() 的区别

    转载自:http://zhuzhichao.com/2013/12/differences-between-jquery-bind-vs-live/ 我见过很多开发者很困惑关于jQuery中的.bin ...

  5. 响应式js设置

    <script> (function anonymous() { // 声明一个函数,并直接的执行 function computed() { let HTML = document.do ...

  6. node 发送 post 请求 get请求。

    因为我们部门打算用node请求restful 然后慢慢替换掉服务端,以后直接请求soa的接口,让前端的数据更贴切项目,因为我们服务端接口和app公用一套,由于业务的需求和版本不统一(例如app6.4的 ...

  7. 【APUE】Chapter1 UNIX System Overview

    这章内容就是“provides a whirlwind tour of the UNIX System from a programmer's perspective”. 其实在看这章内容的时候,已经 ...

  8. (原)自定义资源预览工具:DZAssetPreviewPlugin(1)

    @author: 白袍小道 转载请说明,谢谢     题记 后续工具制作单独作为一本(小道用的是OneNote,这样发布简单点.*--*) 总计放到写完后.     目的 1.快速预览资源(因为大部分 ...

  9. UVA 11883 Repairing a Road(最短路径+暴力枚举)

    You live in a small town with R bidirectional roads connecting C crossings and you want to go from c ...

  10. Postmortem Report 第一轮迭代事后分析报告

    一.设想和目标 1.1 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件<BlueZ>是一款全新动作类塔防游戏.与市面上已经存在的塔防游戏不同 ...