题目:DZY Loves Fibonacci Numbers

题意比較简单,不解释了。

尽管官方的题解也是用线段树,但还利用了二次剩余。

可是我没有想到二次剩余,然后写了个感觉非常复杂度的线段树,还是mark一下吧。

我是这样考虑这个问题的,首先准备三个数组F,G,K,功能后面解释。

然后对它们有这样一个计算:

F[0] = G[0] = 0;
F[1] = 1; G[1] = 0;
K[0] = 1;
K[1] = 0;
for(int i=2; i<N; i++){
F[i] = (F[i-1]+F[i-2])%mod;
G[i] = (G[i-1]+F[i-1])%mod;
K[i] = (K[i-1]+K[i-2])%mod;
}

对于一个斐波那契数列,依据递推式我们能够知道即使我们要从中间開始。仅仅要知道连续两项(隔一项也能够。这里不考虑)。就能够顺利推出后面的值。

那么如果我们知道如今连续两项是v1,v2。那么从它们開始的第n项vn就是:K[n-1]*v1 + K[n]*v2(1)。

同一时候以v1,v2開始的连续n项的和是:F[n]*v1 + G[n]*v2(2)。

上面两个式子都是能够利用斐波那契数列本身的递推式推导得到的。

那么如今对于题目,如果我们要更新的是[L,R]区间,一開始传进去的是v1,v2,

假设如今须要改动子节点了,求出结点的中间值M。对于左边的区间我们知道v1和 v2照旧,关键是右边的须要又一次计算。

右边的第一项在原来的序列里面应该是属于第M+2-L项,记为x,所以能够利用上面(1)求出右边開始的两项。

当我们到达某个结点。它相应的区间和我们要改动的区间一样时,能够利用(2)直接将和加在原来的答案上面。

懒惰标记也非常好做。用f1和f2同一时候维护v1和v2的增量。

假如有两个序列1。1,2。3和2,3,5,8都加到了某个区间上去。

那么懒惰标记维护之后就是f1=1+2=3,,f2=1+3=4,利用递推能够算出后面两项就是7和11,这也符合原先两个序列的叠加。

完毕上面的工作,剩下的查询就是非经常规的求和了。

最后在CF上面跑了1122MS,还算能够吧。

#include<cstdio>
#include<cstring>
const int mod = 1000000009;
const int N = 300010;
typedef long long LL;
#define lson o<<1
#define rson (o<<1)|1
int a[N], l[N<<2], r[N<<2];
LL s[N<<2], f1[N<<2], f2[N<<2];
bool f[N<<2];
LL F[N], G[N], K[N];
inline void in(int &x){
char c=getchar();
x = 0;
while(c<48 || c>57) c=getchar();
while(c>=48 && c<=57){
x = x*10+c-48;
c = getchar();
}
}
void maintain(int o){
s[o] = (s[lson] + s[rson])%mod;
}
void build(int o, int ll, int rr){
l[o] = ll; r[o]=rr;
f[o] = 0;
if(ll<rr){
int m = (ll+rr)>>1;
build(lson, ll, m);
build(rson, m+1, rr);
maintain(o);
}
else{
s[o] = a[ll];
}
}
void update(int o, int ll, int rr, LL v1, LL v2);
void pushdown(int o){
if(f[o]){
int m = (l[o]+r[o])>>1;
update(lson, l[o], m, f1[o], f2[o]);
int x = m + 1 - l[o];
LL t1 = (K[x]*f1[o]%mod + K[x+1]*f2[o]%mod )%mod;
LL t2 = (K[x+1]*f1[o]%mod + K[x+2]*f2[o]%mod )%mod;
update(rson, m+1, r[o], t1, t2);
f[o] = 0;
}
}
void update(int o, int ll, int rr, LL v1, LL v2){
if(l[o]==ll && r[o]==rr){
int len = rr-ll+1;
s[o] = (s[o] + F[len]*v1%mod + G[len]*v2%mod)%mod;
if(!f[o]){
f1[o] = v1;
f2[o] = v2;
f[o] = 1;
}
else{
f1[o] = (f1[o] + v1)%mod;
f2[o] = (f2[o] + v2)%mod;
}
return;
}
pushdown(o);
int m = (l[o]+r[o])>>1;
if(rr<=m) update(lson, ll, rr, v1, v2);
else if(ll>m) update(rson, ll, rr, v1, v2);
else{
update(lson, ll, m, v1, v2);
int x = m + 1 - ll;
LL t1 = (K[x]*v1%mod + K[x+1]*v2%mod)%mod;
LL t2 = (K[x+1]*v1%mod + K[x+2]*v2%mod)%mod;
update(rson, m+1, rr, t1, t2);
}
maintain(o);
}
LL query(int o, int ll, int rr){
if(l[o]==ll && r[o]==rr) return s[o];
pushdown(o);
int m = (l[o]+r[o])>>1;
LL tmp=0;
if(rr<=m) tmp = query(lson, ll, rr);
else if(ll>m) tmp = query(rson, ll, rr);
else{
tmp = (query(lson, ll, m)+query(rson, m+1, rr))%mod;
}
if(tmp<0){
tmp = (tmp%mod + mod)%mod;
}
maintain(o);
return tmp;
}
int main(){
F[0] = G[0] = 0;
F[1] = 1; G[1] = 0;
K[0] = 1;
K[1] = 0;
for(int i=2; i<N; i++){
F[i] = (F[i-1]+F[i-2])%mod;
G[i] = (G[i-1]+F[i-1])%mod;
K[i] = (K[i-1]+K[i-2])%mod;
} int n, m;
in(n); in(m);
for(int i=1; i<=n; i++) in(a[i]);
build(1, 1, n);
int op, x, y;
while(m--){
in(op); in(x); in(y);
if(op&1){
update(1, x, y, 1, 1);
}
else{
printf("%I64d\n", query(1, x, y));
}
}
return 0;
}

Codeforces 446C —— DZY Loves Fibonacci Numbers(线段树)的更多相关文章

  1. ACM学习历程—Codeforces 446C DZY Loves Fibonacci Numbers(线段树 && 数论)

    Description In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence ...

  2. Codeforces 446C DZY Loves Fibonacci Numbers [线段树,数论]

    洛谷 Codeforces 思路 这题知道结论就是水题,不知道就是神仙题-- 斐波那契数有这样一个性质:\(f_{n+m}=f_{n+1}f_m+f_{n}f_{m-1}\). 至于怎么证明嘛-- 即 ...

  3. codeforces 446C DZY Loves Fibonacci Numbers 线段树

    假如F[1] = a, F[2] = B, F[n] = F[n - 1] + F[n - 2]. 写成矩阵表示形式可以很快发现F[n] = f[n - 1] * b + f[n - 2] * a. ...

  4. codeforces 446C DZY Loves Fibonacci Numbers(数学 or 数论+线段树)(两种方法)

    In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence relation F1 ...

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

  6. codeforces 446C DZY Loves Fibonacci Numbers 数论+线段树成段更新

    DZY Loves Fibonacci Numbers Time Limit:4000MS     Memory Limit:262144KB     64bit IO Format:%I64d &a ...

  7. Codeforces 446C - DZY Loves Fibonacci Numbers(斐波那契数列+线段树)

    Codeforces 题目传送门 & 洛谷题目传送门 你可能会疑惑我为什么要写 *2400 的题的题解 首先一个很明显的想法是,看到斐波那契数列和 \(10^9+9\) 就想到通项公式,\(F ...

  8. CF446C DZY Loves Fibonacci Numbers 线段树 + 数学

    有两个性质需要知道: $1.$ 对于任意的 $f[i]=f[i-1]+f[i-2]$ 的数列,都有 $f[i]=fib[i-2]\times f[1]+fib[i-1]\times f[2]$ 其中 ...

  9. Codeforces446C DZY Loves Fibonacci Numbers(线段树 or 分块?)

    第一次看到段更斐波那契数列的,整个人都不会好了.事后看了题解才明白了一些. 首先利用二次剩余的知识,以及一些数列递推式子有下面的 至于怎么解出x^2==5(mod 10^9+9),我就不知道了,但是要 ...

随机推荐

  1. jQuery四叶草菜单效果,跟360杀毒软件差不多

    首先,我们要在js,css文件夹中创建js跟css,然后在body中写入html代码 <main><!--标签是 HTML 5 中的新标签. 素中的内容对于文档来说应当是唯一的.它不 ...

  2. UVM基础之---------uvm report 机制分析

    uvm 中的信息报告机制相对来说比较简单,功能上来说主要分为两部分: 第一通过ID对component的信息报告冗余级别进行控制,针对每个冗余级别进行不同的行为控制.这部分工作主要由uvm_repor ...

  3. ajax的底层前后台交互

    为什么用ajax或者它的优点: 异步加载数据,无需切换页面 更加的用户体验,局部刷新,及时验证,操作步骤简化: 节省流量 js控制数据的加载,更加灵活多用. 底层就是XMLHttpRequest对象: ...

  4. Java 基础入门随笔(5) JavaSE版——函数重载

    1.函数 函数就是定义在类中具有特定功能的一段独立小程序,也称为方法. 定义函数的格式: 修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,...)         {      ...

  5. Learning Face Age Progression: A Pyramid Architecture of GANs

    前言 作为IP模式识别的CNN初始模型是作为单纯判别式-模式识别存在的,并以此为基本模型扩展到各个方向.基本功能为图像判别模型,此后基于Loc+CNN的检测模型-分离式.end2end.以及MaskC ...

  6. intellij idea console 乱码

    修改文件 位置:{用户目录}\{iedea对应版本}\{idea or idea64}.vmoptions 比如我要修改我的配置文件 C:\Users\kkblf\.IntelliJIdea2017. ...

  7. QT,折腾的几天-----关于 QWebEngine的使用

    几天前,不,应该是更早以前,就在寻找一种以HTML5+CSS+Javascript的方式来写桌面应用的解决方案,为什么呢?因为前端那套可以随心所欲的写样式界面啊,恩.其实我只是想使用H5的一些新增功能 ...

  8. RabbitMQ系列(七)--批量消息和延时消息

    批量消息发送模式 批量消息是指把消息放到一个集合统一进行提交,这种方案设计思路是希望消息在一个会话里,比如放到threadlocal里的集合,拥有相同 的会话ID,带有这次提交信息的size等属性,最 ...

  9. java虚拟机(四)--内存溢出、内存泄漏、SOF

    学习了java运行时数据区,知道每个内存区域保存什么数据,可以参考:https://www.cnblogs.com/huigelaile/p/diamondshine.html,然后了 解内存溢出和内 ...

  10. 13Microsoft SQL Server SQL 高级事务,锁,游标,分区

    Microsoft SQL Server SQL高级事务,锁,游标,分区 通过采用事务和锁机制,解决了数据库系统的并发性问题. 9.1数据库事务 (1)BEGIN TRANSACTION语句定义事务的 ...