「CF446C」 DZY Loves Fibonacci Numbers
「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的更多相关文章
- 【CF446C】DZY Loves Fibonacci Numbers (线段树 + 斐波那契数列)
Description 看题戳我 给你一个序列,要求支持区间加斐波那契数列和区间求和.\(~n \leq 3 \times 10 ^ 5, ~fib_1 = fib_2 = 1~\). Solut ...
- cf446C 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
我这种maintain写法好zz.考试时获得了40pts的RE好成绩 In mathematical terms, the sequence Fn of Fibonacci numbers is de ...
- codeforces 446C DZY Loves Fibonacci Numbers(数学 or 数论+线段树)(两种方法)
In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence relation F1 ...
- 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 ...
- Codeforces Round #FF 446 C. DZY Loves Fibonacci Numbers
參考:http://www.cnblogs.com/chanme/p/3843859.html 然后我看到在别人的AC的方法里还有这么一种神方法,他预先设定了一个阈值K,当当前的更新操作数j<K ...
- Codeforces446C - DZY Loves Fibonacci Numbers
Portal Description 给出一个\(n(n\leq3\times10^5)\)个数的序列,进行\(m(m\leq3\times10^5)\)次操作,操作有两种: 给区间\([L,R]\) ...
- [CodeForces - 447E] E - DZY Loves Fibonacci Numbers
E DZY Loves Fibonacci Numbers In mathematical terms, the sequence Fn of Fibonacci numbers is define ...
- ACM学习历程—Codeforces 446C DZY Loves Fibonacci Numbers(线段树 && 数论)
Description In mathematical terms, the sequence Fn of Fibonacci numbers is defined by the recurrence ...
随机推荐
- 微服务系列(二)GRPC的介绍与安装
微服务系列(二)GRPC的介绍与安装 1.GPRC简介 GRPC是Google公司基于Protobuf开发的跨语言的开源RPC框架.GRPC基于HTTP/2协议设计,可以基于一个HTTP/2链接提供多 ...
- Go语言实现Snowflake雪花算法
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/527 每次放长假的在家里的时候,总想找点简单的例子来看看实现原理,这 ...
- JVM学习心得—JVM内存模型(个人整理,请勿转载)
一.运行时数据区域 线程私有的:程序计数器+虚拟机栈+本地方法栈 线程共享的:堆+方法区(运行时常量池)+直接内存(非运行时数据区的一部分) *JDK1.8后将方法区废除,新增元空间. 1.1 程序计 ...
- YOLOv4全文阅读(全文中文翻译)
YOLOv4全文阅读(全文中文翻译) YOLOv4: Optimal Speed and Accuracy of Object Detection 论文链接: https://arxiv.org/pd ...
- 智能物联网(AIoT,2020年)(下)
智能物联网(AIoT,2020年)(下) 12工业物联网是AIoT在工业领域第一战场 工业物联网分为感知.决策.执行,OS与软件是大脑+神经 13工业场景下一步如何使用AIoT 不止工业物联网:用人工 ...
- C++中头文件和实现文件的关系
头文件相当于是声明的集合,包括头文件的语句#Include实质为程序代码的宏替换. 编译阶段将函数和变量登记在符号表,链接时将各种函数的入口地址在其中查找到来调用,解引用.
- 认真总结Vue3中ref与reactive区别和isRef与isReactive 类型判断
1.什么是ref? 1.ref和reactive-样 也是用来实现响应式数据的方法 由于reactive必须传递一个对象, 所以导致在企业开发中如果我们只想让某个变量实现响应式的时候会非常麻烦 所以V ...
- springboot实现自定义拦截器
为了更容易理解,我们通过一个代码例子来演示. 例子: 我们现在要访问http://localhost:8080/main.html页面,这个页面需要登录之后才能够浏览,没登录不能浏览. 那么现在问题来 ...
- selenium常用方法集合
一.selenium定位元素的8种方法: 1.find_element_by_id() 2.find_element_by_name() 3.find_element_by_css() 4.find_ ...
- 从JDBC到ORM的事务实现
一.JDBC 早期SUN公司想编写一套可以连接天下所有数据库的API,但是当他们刚刚开始时就发现这是不可完成的任务,因为各个厂商的数据库服务器差异太大了.后来SUN开始与数据库厂商们讨论,最终得出的结 ...