Codeforces 316E3 线段树 + 斐波那切数列 (看题解)
最关键的一点就是
f[ 0 ] * a[ 0 ] + f[ 1 ] * a[ 1 ] + ... + f[ n - 1] * a[ n - 1]
f[ 1 ] * a[ 0 ] + f[ 2 ] * a[ 1 ] + ... + f[ n ] * a[ n - 1]
f[ 2 ] * a[ 0 ] + f[ 3 ] * a[ 1 ] + ... + f[ n + 1] * a[ n - 1]
......
这也是满足斐波那切的性质
也就是说,系数的斐波那切的多项式也能向斐波那切一样递推。
然后我们在线段树上保存系数为f[ 0 ]开始的多项式的值和系数为f[ 1 ]开始的多项式的值。
#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ull unsigned long long using namespace std; const int N = 2e5 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-;
const double PI = acos(-); void add(int& a, int b) {
a += b; if(a >= mod) a -= mod;
} int mat[N][][], f[N], g[N]; void print(int o) {
puts("");
for(int i = ; i < ; i++) {
for(int j = ; j < ; j++) {
printf("%d ", mat[o][i][j]);
}
puts("");
}
} #define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
int f0[N << ], f1[N << ];
int lazy[N << ]; inline int getVal(int f0, int f1, int k) {
if(k == ) return f0;
else if(k == ) return f1;
else return (1LL * mat[k - ][][] * f1 % mod + 1LL * mat[k - ][][] * f0 % mod) % mod;
}
void pull(int rt, int l, int r) {
int mid = l + r >> ;
f0[rt] = f0[rt << ];
f1[rt] = f1[rt << ];
add(f0[rt], getVal(f0[rt << | ], f1[rt << | ], mid - l + ));
add(f1[rt], getVal(f0[rt << | ], f1[rt << | ], mid - l + ));
}
void push(int rt, int l, int r) {
int mid = l + r >> ;
if(lazy[rt]) {
add(lazy[rt << ], lazy[rt]);
add(lazy[rt << | ], lazy[rt]);
add(f0[rt << ], 1LL * lazy[rt] * f[mid - l] % mod);
add(f0[rt << | ], 1LL * lazy[rt] * f[r - mid - ] % mod);
add(f1[rt << ], 1LL * lazy[rt] * g[mid - l] % mod);
add(f1[rt << | ], 1LL * lazy[rt] * g[r - mid - ] % mod);
lazy[rt] = ;
}
}
void build(int l, int r, int rt) {
if(l == r) {
scanf("%d", &f0[rt]);
f1[rt] = f0[rt];
return;
}
int mid = l + r >> ;
build(lson); build(rson);
pull(rt, l, r);
}
void update(int L, int R, int d, int l, int r, int rt) {
if(r < L || R < l) return;
if(L <= l && r <= R) {
add(f0[rt], 1LL * d * f[r - l] % mod);
add(f1[rt], 1LL * d * g[r - l] % mod);
add(lazy[rt], d);
return ;
}
push(rt, l, r);
int mid = l + r >> ;
update(L, R, d, lson);
update(L, R, d, rson);
pull(rt, l, r);
}
int query(int L, int R, int l, int r, int rt) {
if(r < L || R < l) return ;
if(L <= l && r <= R) return getVal(f0[rt], f1[rt], l - L);
push(rt, l, r);
int mid = l + r >> ;
return (query(L, R, lson) + query(L, R, rson)) % mod;
} int n, m;
int main() {
mat[][][] = ; mat[][][] = ;
mat[][][] = ; mat[][][] = ;
mat[][][] = mat[][][] = ;
mat[][][] = ; mat[][][] = ;
for(int o = ; o < N; o++) {
for(int i = ; i < ; i++)
for(int j = ; j < ; j++)
for(int k = ; k < ; k++)
mat[o][i][j] = (mat[o][i][j] + 1LL * mat[][i][k] * mat[o - ][k][j] % mod) % mod;
}
f[] = f[] = ;
for(int i = ; i < N; i++) f[i] = (f[i - ] + f[i - ]) % mod;
for(int i = ; i < N; i++) add(f[i], f[i - ]);
g[] = , g[] = ;
for(int i = ; i < N; i++) g[i] = (g[i - ] + g[i - ]) % mod;
for(int i = ; i < N; i++) add(g[i], g[i - ]); scanf("%d%d", &n, &m);
build(, n, );
while(m--) {
int op;
scanf("%d", &op);
if(op == ) {
int x, v;
scanf("%d%d", &x, &v);
int ret = query(x, x, , n, );
update(x, x, -ret, , n, );
update(x, x, v, , n, );
} else if(op == ) {
int L, R;
scanf("%d%d", &L, &R);
printf("%d\n", query(L, R, , n, ));
} else {
int L, R, d;
scanf("%d%d%d", &L, &R, &d);
update(L, R, d, , n, );
}
}
return ;
} /*
*/
Codeforces 316E3 线段树 + 斐波那切数列 (看题解)的更多相关文章
- [Codeforces 316E3]Summer Homework(线段树+斐波那契数列)
[Codeforces 316E3]Summer Homework(线段树+斐波那契数列) 顺便安利一下这个博客,给了我很大启发(https://gaisaiyuno.github.io/) 题面 有 ...
- Codeforces 446-C DZY Loves Fibonacci Numbers 同余 线段树 斐波那契数列
C. DZY Loves Fibonacci Numbers time limit per test 4 seconds memory limit per test 256 megabytes inp ...
- 【CF446C】DZY Loves Fibonacci Numbers (线段树 + 斐波那契数列)
Description 看题戳我 给你一个序列,要求支持区间加斐波那契数列和区间求和.\(~n \leq 3 \times 10 ^ 5, ~fib_1 = fib_2 = 1~\). Solut ...
- python---复杂度、斐波那切数列、汉诺塔
时间复杂度 用来估计算法运行时间的一个式子. 一般来说, 时间复杂度高的算法比复杂度低的算法慢. 常见的时间复杂度: O(1) < O(logn) < O(n) < O( ...
- [莫队算法 线段树 斐波那契 暴力] Codeforces 633H Fibonacci-ish II
题目大意:给出一个长度为n的数列a. 对于一个询问lj和rj.将a[lj]到a[rj]从小到大排序后并去重.设得到的新数列为b,长度为k,求F1*b1+F2*b2+F3*b3+...+Fk*bk.当中 ...
- Linux环境C语言斐波拉切数列(1,1,2,3,5,8,13,.........)实现
斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一 ...
- 从斐波那契数列看java方法的调用过程
先看斐波那契数列的定义: 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为 ...
- (转)从斐波那契数列看Java方法的调用过程
斐波那契数列的定义: 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家列安纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔 ...
- hdu 4983 线段树+斐波那契数
http://acm.hdu.edu.cn/showproblem.php?pid=4893 三种操作: 1 k d, 修改k的为值增加d 2 l r, 查询l到r的区间和 3 l r, 从l到r区间 ...
随机推荐
- webservice:com.sun.xml.internal.ws.server.ServerRtException: [failed to localize]
发布webservice发生了错误,一直没有能够解决,错误如下: Exception in thread "main" com.sun.xml.internal.ws.server ...
- why should the parameter in copy construction be a reference
if not, it will lead to an endless loop!!! # include<iostream> using namespace std; class A { ...
- 前端 -----jQuery的选择器
02-jQuery的选择器 我们以前在CSS中学习的选择器有: 今天来学习一下jQuery 选择器. jQuery选择器是jQuery强大的体现,它提供了一组方法,让我们更加方便的获取到页面中的元 ...
- Hystrix系列-5-Hystrix的资源隔离策略
转自:https://blog.csdn.net/liuchuanhong1/article/details/73718794 Hystrix的资源隔离策略有两种,分别为:线程池和信号量. 说到资源隔 ...
- C# 防止content-type修改后上传恶意文件
以图片为例子.在上传图片的时候,使用Fiddler抓取 通过js判断文件类型是不安全的,所以通过后台来判断,代码如下: ) { HttpPostedFile file0 = Request.Files ...
- html跳转指定位置-利用锚点
比如我现在 a.html 的时候,我想跳转到 b.html ,并且是 b.html 的某一个位置,用 <a href=>, a.html里: <a href="b.html ...
- java怎样将一组对象传入Oracle存储过程
注:本文来源 < java怎样将一组对象传入Oracle存储过程 > java怎样将一组对象传入Oracle存储过程 java怎样将一组对象传入Oracle存储过程.须要注意的是jar ...
- 电子书转换为PDF格式
目录 一.mobi 转换 pdf 步骤 二.查看转换后的结果目录 三.将PDF还原文件名且移出至新目录 背景:当我们从网上下载一些电子小说或书籍的时候,一般文件的格式可能是.epub..mobi等.这 ...
- 【kafka】celery与kafka的联用问题
背景:一个小应用,用celery下发任务,任务内容为kafka生产一些数据. 问题:使用confluent_kafka模块时,单独启用kafka可以正常生产消息,但是套上celery后,kafka就无 ...
- Nginx详解二十九:基于Nginx的中间件架构设计
基于Nginx的中间件架构 一:了解需求 1.定义Nginx在服务体系中的角色 1.静态资源服务 2.代理服务 3.动静分离 2.静态资源服务的功能设计 3.代理服务 二:设计评估 三:配置注意事项