首页 > 其他分享 >8.CF446C DZY Loves Fibonacci Numbers 线段树Lazy标记

8.CF446C DZY Loves Fibonacci Numbers 线段树Lazy标记

时间:2022-10-28 10:32:15浏览次数:88  
标签:rt Lazy CF446C int mid tag Fibonacci fab MOD


8.CF446C DZY Loves Fibonacci Numbers 线段树Lazy标记


给定序列,要求支持区间对应项加斐波那契数列,区间求和

洛谷传送门:​​CF446C DZY Loves Fibonacci Numbers - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)​

CF传送门:​​C. DZY Loves Fibonacci Numbers (codeforces.com)​

题目分析

给定序列,要求支持区间对应项加斐波那契数列,区间求和
考虑广义斐波那契数列:在一个区间加斐波那契数列后,区间会保持斐波那契数列的性质

考虑对每个区间维护两个标记,分别表示, 标记下放时计算加和。

标记下放略微复杂,理清楚就好。注意标记下放给左右子节点标记时也需要考虑斐波那契性质的影响!

Code

#include <bits/stdc++.h>
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define endl '\n'
using namespace std;

const int N = 3e5 + 10, MOD = 1e9 + 9;

int fab[N];

inline void init(){
fab[1] = fab[2] = 1;
for(int i = 3; i <= 3e5 + 2; i++) fab[i] = (fab[i - 1] + fab[i - 2]) % MOD;
}

namespace SegTree{
#define ls rt << 1
#define rs rt << 1 | 1
#define lson ls, l,
#define rson rs, mid + 1,

int tree[N << 2], tag[N << 2][2];

inline void push_up(int rt){ tree[rt] = (tree[ls] + tree[rs]) % MOD; }

inline void push_down(int rt, int l, int r){
if(!tag[rt][0] && !tag[rt][1]) return;
int mid = l + r >> 1;
(tag[ls][0] += tag[rt][0]) %= MOD;
(tag[ls][1] += tag[rt][1]) %= MOD;
(tree[ls] += tag[rt][0] * fab[mid - l + 1] % MOD + tag[rt][1] * (fab[mid - l + 2] - 1) % MOD) %= MOD;
(tag[rs][0] += tag[rt][0] * fab[mid - l] % MOD + tag[rt][1] * fab[mid - l + 1] % MOD) %= MOD;
(tag[rs][1] += tag[rt][0] * fab[mid - l + 1] % MOD + tag[rt][1] * fab[mid - l + 2] % MOD) %= MOD;
(tree[rs] += (tag[rt][0] * fab[r - l + 1] + tag[rt][1] * (fab[r - l + 2] - 1)) - (tag[rt][0] * fab[mid - l + 1] + tag[rt][1] * (fab[mid - l + 2] - 1))) %= MOD;
tag[rt][0] = tag[rt][1] = 0;
}

void build(int rt, int l, int r){
tag[rt][0] = tag[rt][1] = 0;
if(l == r){
cin >> tree[rt];
return;
}
int mid = l + r >> 1;
build(lson), build(rson);
push_up(rt);
}

void update(int rt, int l, int r, int L, int R){
if(l >= L && r <= R){
int a_1 = fab[l - L + 1], a_2 = fab[l - L + 2];
(tag[rt][0] += a_1) %= MOD;
(tag[rt][1] += a_2) %= MOD;
(tree[rt] += a_1 * fab[r - l + 1] % MOD + a_2 * (fab[r - l + 2] - 1) % MOD) %= MOD;
return;
}
push_down(rt, l, r);
int mid = l + r >> 1;
if(mid >= L) update(lson, L, R);
if(mid < R) update(rson, L, R);
push_up(rt);
}

int query(int rt, int l, int r, int L, int R){
if(l >= L && r <= R) return tree[rt];
push_down(rt, l, r);
int mid = l + r >> 1, ans = 0;
if(mid >= L) (ans += query(lson, L, R)) %= MOD;
if(mid < R) (ans += query(rson, L, R)) %= MOD;
return ans;
}

}

#define SEGRG 1, 1,

inline void solve(){
int n, m; cin >> n >> m;
SegTree::build(SEGRG);
while(m--){
int op, l = 0, r = 0; cin >> op >> l >> r;
if(op == 1){
SegTree::update(SEGRG, l, r);
} else {
cout << (SegTree::query(SEGRG, l, r) % MOD + MOD) % MOD << endl;
}
}
}

signed main(){
init();
ios_base::sync_with_stdio(false), cin.tie(0);
cout << fixed << setprecision(12);
int t = 1; //cin >> t;
while(t--) solve();
return 0;
}


标签:rt,Lazy,CF446C,int,mid,tag,Fibonacci,fab,MOD
From: https://blog.51cto.com/u_12372287/5803562

相关文章

  • 利用Jquery Lazyload JS插件实现图片延迟加载
    JqueryLazyload是一款图片延迟加载JS插件,本文介绍该JS的使用方法。最新的jquerylazyload可以单独使用(即不依赖jquery),本文介绍的是依赖jquery的使用及配置方法。Github项目......
  • Fibonacci数列
    求斐波那契数列前15项和并打印出其中的奇数之和>#include<stdio.h>intmain(){intfib[15];inti,s=0;fib[1]=1;fib[0]=1;for(i=0;i<15;i++){ fib[i+2]=fib[i......
  • 定义一个大小为30的整型一维数组x,并将该数组的前2个元素初始化为1,使用循环语句将Fibon
    定义数组和数组元素赋值1、定义一个大小为30的整型一维数组x,并将该数组的前2个元素初始化为1,使用循环语句将Fibonacci(菲波那契)数列的前30项依次赋给x[0]、x[1]、x[2]……......
  • [Typescript] 62. Medium - Fibonacci Sequence
    Implementageneric Fibonacci<T> thattakesanumber T andreturnsitscorresponding Fibonaccinumber.Thesequencestarts:1,1,2,3,5,8,13,21,34,......
  • mybatis_22_设置(setting)_aggressiveLazyLoading
    aggressiveLazyLoading开启时,任一方法的调用都会加载该对象的所有延迟加载属性。否则,每个延迟加载属性会按需加载。值:true(3.4.1及之前版本默认)/false(默认)<settings>......
  • mybatis_21_设置(settings)_lazyLoadingEnabled
    lazyLoadingEnabled延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。值:true/false(默认)<se......
  • NC14359 Fibonacci数列
    链接:https://ac.nowcoder.com/acm/problem/14359来源:牛客网题目描述Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。当n比较大时,Fn也非常大,现在我们想知道,Fn除以1......
  • computed&&lazy
    副作用函数effect:它的执行间接或者直接的影响了其他函数的执行。effect会立即执行传递给它的副作用函数,但是这样很消耗性能,在需要的时候再执行,将它变为lazy的。懒计算la......
  • @Lazy注解的使用
    @Lazy注解主要有两种用途:一是可以减少Spring的IOC容器启动时的加载时间。二是可以解决bean的循环依赖问题。@Lazy的简介@Lazy注解用于标识bean是否需要延迟加载。@T......
  • Typescript类型体操 - FibonacciSequence
    题目中文实现一个输入参数为数字T的泛型类型Fibonacci<T>,返回T对应的斐波那契数斐波那契数列:1,1,2,3,5,8,13,21,34,55,89,144,...示例:typeRes......