题目大意

给定长度为$n$序列$A$,将它划分成尽可能少的若干部分,使得任意部分内两两之和均不为斐波那契数列中的某一项。

题解

不难发现$2\times 10^9$之内的斐波那契数不超过$50$个

先求出第$i$个数之前最后一个能和第$i$个数相加为斐波那契数的位置$last_i$。

考虑每一部分$[l,r]$只需满足$\max\{last_i\}<l(i\in [l,r])$即可。

那么设$F_i$表示以$i$为结尾最小化分数,那么转移到$i$的$j$显然是一段左右端点均单调不递减的区间,用单调队列维护即可。

#include<bits/stdc++.h>
#define debug(x) cerr<<#x<<" = "<<x
#define sp <<" "
#define el <<endl
#define LL long long
#define M 100020
#define MAXN 2000000000
using namespace std;
int read(){
int nm=0,fh=1; char cw=getchar();
for(;!isdigit(cw);cw=getchar()) if(cw=='-') fh=-fh;
for(;isdigit(cw);cw=getchar()) nm=nm*10+(cw-'0');
return nm*fh;
}
map<int,int>MP; int n,m,p[M],F[M],last[M],G[M],q[M],hd,tl;
int main(){
G[1]=1,G[2]=2,F[1]=1; n=read();
for(m=2;(LL)G[m-1]+(LL)G[m]<=MAXN;m++) G[m+1]=G[m]+G[m-1];
for(int i=1;i<=n;i++) p[i]=read();
MP[p[1]]=1,q[tl++]=0,q[tl++]=1;
for(int i=2,now=0;i<=n;i++){
last[i]=0;
for(int j=0;j<=m;j++){
if(!MP.count(G[j]-p[i])) continue;
int k=MP[G[j]-p[i]]; last[i]=max(last[i],k);
} now=max(now,last[i]);
while(q[hd]<now) hd++; F[i]=F[q[hd]]+1,MP[p[i]]=i;
while(F[q[tl-1]]>=F[i]&&hd<tl) tl--; q[tl++]=i;
}
printf("%d\n",F[n]);
return 0;
}

最新文章

  1. php数据访问(批量删除)
  2. phpcms v9编辑器ckeditor设置回车换行br为段落p标签
  3. 3.C#中的多重委托
  4. WIN7 64位系统下的服务程序更新失败问题解决
  5. (转)jquery对表单元素的取值和赋值
  6. C++ builder 操作Excel方法(据网上资料整理)
  7. php Late Static Bindings延迟静态绑定
  8. dig命令浅析
  9. Android Dialog触摸对话框外部让其消失的实现方法
  10. 洛谷-三连击(升级版)-BOSS战-入门综合练习1
  11. shell中的readonly
  12. python基础-------函数(一)
  13. iOS开发造轮子 | 通用占位图
  14. 课程存储校对:程序设计思想、源程序代码、运行结果截图,以及开发过程中的项目计划日志、时间记录日志、缺陷记录日志(PSP0级记录)。
  15. 从源码的角度分析List与Set的区别
  16. 【BZOJ4504】K个串
  17. go语言学习-goroutine
  18. selenium 指定滚动到某个元素
  19. WorldWind源码剖析系列:下载请求类DownloadRequest
  20. XPages访问关系型数据库技术与最佳实践

热门文章

  1. getchar,scanf以及缓冲区
  2. 分布式计算开源框架Hadoop入门实践(一)
  3. STM32 ~ CH340在STM32实现一键下载电路
  4. ibatis工作原理
  5. PHP/Yii2操作Cookie,常见问题以及注意事项
  6. c# 虚方法(virtual)与 多态(Polymorphism)
  7. PHP封装时间类
  8. codeforces 155D 质数
  9. relativePath
  10. 算法总结之 在单链表和双链表中删除倒数第k个节点