洛谷

听说这题可以\(n^2\)水过去,不过这里介绍一种\(O(n)\)的做法。

\(f[i]\)为第\(1~i\)位合并的次数。

\(pre[i]\)为第\(1~i\)位最末尾的数。

\(j\)为满足\(sum[i]−sum[j]>=pre[j]\)的最大数。

所以很好推出:

\(f[i]=f[j]+i−j−1~~~~~pre[i]=sum[i]−sum[j]\)

显然\(pre[i]\)越小越好,这样找到一个就可以退出。

所以可以直接用单调队列优化。

时间复杂度\(O(n)\)。

代码,注意开\(\texttt{long~long}\):

#include <bits/stdc++.h>
using namespace std;
typedef int _int;
#define int long long const int N=200010;
int head,tail=1;
int n,f[N],pre[N],sum[N],q[N]; _int main()
{
ios::sync_with_stdio(false);
cin>>n;
int x;
for (int i=1;i<=n;++i)
cin>>x,sum[i]=sum[i-1]+x;
for (int i=1;i<=n;++i) {
while (head+1<tail&&sum[i]>=sum[q[head+1]]+pre[q[head+1]])
++head;
f[i]=f[q[head]]+1;
pre[i]=sum[i]-sum[q[head]];
while (head<tail&&sum[q[tail-1]]+pre[q[tail-1]]>sum[i]+pre[i])
--tail;
q[tail++]=i;
}
cout<<n-f[n];
return 0;
}

最新文章

  1. 轻量级前端MVVM框架avalon源码分析-总结
  2. 使用VS2015开发跨平台APP
  3. c :set标签的陷阱(未解决)
  4. [No000044]你是否还傻到把最好的留在最后?
  5. Maven 实用命令和技巧
  6. S3C2440 裸机程序之音频
  7. mysql中实现oracle中的rowid功能
  8. JQuery动态增加删除元素
  9. JavaScript实现div宽、高自动缓慢拉伸
  10. Win32 Windows编程 九
  11. CODEFORCES ROUND #273 DIV2
  12. Android中服务的生命周期回调方法
  13. Python之登录接口
  14. 基于线程池的线程管理(BlockingQueue生产者消费者方式)实例
  15. Django 中使用ImgFiled 和FileFiled
  16. java上传文件获取跟目录的办法
  17. php冒泡排序实现方法,传入几个数字排序后 输出实战例子
  18. C# 判断ip地址是否正确
  19. Linux快速学习系列
  20. 洛谷P3953 [NOIP2017]逛公园

热门文章

  1. Springboot client 常用配置详解
  2. CCNA2.0笔记_NAT
  3. Unix系统编程()文件空洞
  4. jQuery 实战读书笔记之第二章:选择元素
  5. python 的__FILE__,__LINE__功能实现
  6. curl myip.ipip.net curl ip.cn curl cip.cc
  7. dva学习---effects异步中通过select获取当前的state
  8. Gradle学习系列之一——Gradle快速入门(转)
  9. mac上制作u盘启动盘
  10. 将字符“12345”转换成long型