「CF446C」 DZY Loves Fibonacci Numbers

这里提供一种优美的根号分治做法。

首先,我们考虑一种不太一样的暴力。对于一个区间加斐波那契数的操作 \([a,b]\),以及一个区间求和的操作 \([p,q]\),仅需预处理斐波那契数列前缀和,我们就可以在 \(O(1)\) 的时间内算出 \([a,b]\) 对 \([p,q]\) 的贡献。

这样的复杂度为 \(O(n^2)\)。

再考虑传统暴力:对于一个区间加斐波那契数的操作 \([a,b]\),直接将其作用到原数列 \(a\) 上。

那么我们可不可以将多个区间加斐波那契数的操作一起作用到原数列上呢?

答案是肯定的。

首先有一个显然的结论:若 \(a_i=a_{i-1}+a_{i-2},b_j=b_{j-1}+b_{j-2}\),则有 \(a_i+b_j=a_{i-1}+a_{i-2}+b_{j-1}+b_{j-2}\)。

这启发我们可以对于多次区间加同时进行递推。

我们维护每个区间加操作的起止点,在操作开始时加入数 \(1\) 进行递推,操作结束时删除该操作所用到的两个数,就可以在 \(O(n)\) 的时间内将多次操作同时进行。

具体可见代码,非常清晰。

若我们每 \(T\) 次操作后将当前的多个区间加斐波那契数的操作一起作用到原数列上,其余时候暴力,这样的最坏复杂度为 \(O(\frac{n^2}{T}+Tn)\)。取 $T=\sqrt n $ 时复杂度最优,为 \(O(n\sqrt n)\)。虽在理论复杂度上逊于线段树解法,但其常数小,代码复杂度低,实际表现与实现一般的线段树相差无几甚至略优,不失为一种良好的解题方式。

同时注意,块长的调整可能会使该算法的效率进一步提升,因为显然 \(O(Tn)\) 部分是达不到上界的,故代码对于重构的实现方式与题解略有不同。

贴代码:

#include<bits/stdc++.h>
using namespace std;
const int p=1e9+9;
const int maxn=3e5+5;
int fib[maxn],sum[maxn];
int b[maxn],v[maxn],val[maxn];
int l[maxn],r[maxn],tot;
int n,m;
int md(int x){
if(x>p) return x-p;
if(x<0) return x+p;
return x;
}
vector<int> p1[maxn],p2[maxn];
void rebuild(){
for(int i=1;i<=tot;++i){
p1[l[i]].emplace_back(i);
p2[r[i]].emplace_back(i);
}
int a=0,b=0;
for(int i=1;i<=n;++i){
int c=md(a+b);
val[i]=md(val[i]+c);
a=b,b=c;
for(auto x:p1[i]) b=md(b+1),val[i]=md(val[i]+1);
for(auto x:p2[i]){
int L=l[x],R=r[x];
b=md(b-fib[R-L+1]);
a=md(a-fib[R-L]);
}
v[i]=md(v[i-1]+val[i]);
}
for(int i=1;i<=tot;++i){
p1[l[i]].clear();
p2[r[i]].clear();
}
tot=0;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
fib[1]=1,fib[2]=1;
for(int i=3;i<=n;++i) fib[i]=md(fib[i-1]+fib[i-2]);
for(int i=1;i<=n;++i) sum[i]=md(sum[i-1]+fib[i]);
for(int i=1;i<=n;++i) cin>>val[i],v[i]=md(v[i-1]+val[i]);
int lim=sqrt(m);
for(int _=1;_<=m;++_){
int opt,a,b;cin>>opt>>a>>b;
if(opt==1) l[++tot]=a,r[tot]=b;
else{
int ans=0;
for(int i=1;i<=tot;++i){
int L=max(a,l[i]),R=min(b,r[i]);
if(L<=R){
ans=md(ans+md(sum[R-l[i]+1]-sum[L-l[i]]));
if(ans>p) ans-=p;
}
}
cout<<md(ans+md(v[b]-v[a-1]))<<'\n';
}
if(tot==lim) rebuild();
}
return 0;
}

「CF446C」 DZY Loves Fibonacci Numbers的更多相关文章

  1. 【CF446C】DZY Loves Fibonacci Numbers (线段树 + 斐波那契数列)

    Description ​ 看题戳我 给你一个序列,要求支持区间加斐波那契数列和区间求和.\(~n \leq 3 \times 10 ^ 5, ~fib_1 = fib_2 = 1~\). Solut ...

  2. cf446C DZY Loves Fibonacci Numbers

    C. DZY Loves Fibonacci Numbers time limit per test 4 seconds memory limit per test 256 megabytes inp ...

  3. 【思维题 线段树】cf446C. DZY Loves Fibonacci Numbers

    我这种maintain写法好zz.考试时获得了40pts的RE好成绩 In mathematical terms, the sequence Fn of Fibonacci numbers is de ...

  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 Round #FF 446 C. DZY Loves Fibonacci Numbers

    參考:http://www.cnblogs.com/chanme/p/3843859.html 然后我看到在别人的AC的方法里还有这么一种神方法,他预先设定了一个阈值K,当当前的更新操作数j<K ...

  7. Codeforces446C - DZY Loves Fibonacci Numbers

    Portal Description 给出一个\(n(n\leq3\times10^5)\)个数的序列,进行\(m(m\leq3\times10^5)\)次操作,操作有两种: 给区间\([L,R]\) ...

  8. [CodeForces - 447E] E - DZY Loves Fibonacci Numbers

    E  DZY Loves Fibonacci Numbers In mathematical terms, the sequence Fn of Fibonacci numbers is define ...

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

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

随机推荐

  1. sentinel入门

    sentinel下载:sentinel-dashboard-1.8.1.jar 下载完成后进入sentinel-dashboard-1.8.1.jar的文件夹,在cmd中输入java -jar sen ...

  2. maxscrip_import_csv_构建对象

    3DMAX通过脚本文件批量操作相当有效率,国内关于maxscript的资料比较少,知识点比较零散,逐步进行补充. 导入文件: filepath = "... Data\\01_us.csv& ...

  3. jupyter notebook快捷键使用的注意点

    来源:https://zhidao.baidu.com/question/1800695798976401387.html 本文做进一步的阐释: 1.使行出现,但是光标要点击到有line空白区域 直接 ...

  4. 干货:ANR日志分析全面解析

    一.概述 解决ANR一直是Android 开发者需要掌握的重要技巧,一般从三个方面着手. 开发阶段:通过工具检查各个方法的耗时,卡顿情况,发现一处修改一处. 线上阶段:这个阶段主要依靠监控工具发现AN ...

  5. PaddlePaddle推理部署

    PaddlePaddle推理部署 飞桨推理产品简介 作为飞桨生态重要的一部分,飞桨提供了多个推理产品,完整承接深度学习模型应用的最后一公里. 整体上分,推理产品主要包括如下子产品 各产品在推理生态中的 ...

  6. Auto ML自动调参

    Auto ML自动调参 本文介绍Auto ML自动调参的算法介绍及操作流程. 操作步骤 登录PAI控制台. 单击左侧导航栏的实验并选择某个实验. 本文以雾霾天气预测实验为例. 在实验画布区,单击左上角 ...

  7. PyTorch 数据并行处理

    PyTorch 数据并行处理 可选择:数据并行处理(文末有完整代码下载) 本文将学习如何用 DataParallel 来使用多 GPU. 通过 PyTorch 使用多个 GPU 非常简单.可以将模型放 ...

  8. [NOIP2010 提高组] 机器翻译

    问题描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件会先在内存中查 ...

  9. Python基础_python的数据类型

    一.Python 的标准数据类型 二.以下单个实际举例分析数据类型 2.1 python的数字类型 Int:整型,Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以 Python ...

  10. LongAdder源码阅读笔记

    功能描述 LongAdder通过创建多个副本对象,解决了多线程使用CAS更新同一个对象造成的CPU阻塞,加快了对线程处理的速度.当多个线程同一时刻更新一个AtomicLong类型的变量时,只有一个线程 ...