题目链接

题意分析

首先这道题不可以使用简单的贪心来做

根据\(DP\) 我们令\(dp[i]\)表示当前到了\(i\)一共做了\(dp[i]\)次合并

\(pre[i]\)表示当前合并到了\(i\)后序列末尾的数

那么$$dp[i]=min{dp[j]+i-j,sum[i]-sum[j]≥pre[j]}$$

可惜是\(O(n^2)\)的


我们考虑由于是\(dp[i]=dp[j]+val_i\)的形式

所以我们可以使用单调队列优化


\[sum[i]≥sum[j]+pre[j]
\]

根据贪心法则 我们希望恰好满足

所以我们维护一个递增的单调队列

CODE:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<list>
#include<set>
#include<deque>
#include<vector>
#include<ctime>
#define ll long long
#define inf 0x7fffffff
#define N 500008
#define IL inline
#define M 1008611
#define D double
#define ull unsigned long long
#define R register
using namespace std;
template<typename T>IL void read(T &_)
{
T __=0,___=1;char ____=getchar();
while(!isdigit(____)) {if(____=='-') ___=0;____=getchar();}
while(isdigit(____)) {__=(__<<1)+(__<<3)+____-'0';____=getchar();}
_=___ ? __:-__;
}
/*-------------OI使我快乐-------------*/
int n,head,tail;
int num[N],que[N],dp[N];
ll sum[N],pre[N];
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
read(n);
for(R int i=1;i<=n;++i) read(num[i]);
for(R int i=1;i<=n;++i) sum[i]=sum[i-1]+1ll*num[i];
head=0;tail=1;
for(R int i=1;i<=n;++i)
{
while(head+1<tail&&sum[i]>=sum[que[head+1]]+pre[que[head+1]]) ++head;
pre[i]=sum[i]-sum[que[head]];dp[i]=i-que[head]-1+dp[que[head]];
while(head<tail&&sum[i]+pre[i]<sum[que[tail-1]]+pre[que[tail-1]]) --tail;
que[tail++]=i;
}
printf("%d\n",dp[n]);
// fclose(stdin);
// fclose(stdout);
return 0;
}

HEOI 2019 RP++

最新文章

  1. unixLike命令拾遗
  2. 关于eclipse删除servers之后,不能新建其所对应版本的Servers
  3. win10 1607 密匙
  4. Linux C/C++ --- “” and &lt;&gt; in the use of head include file(Pending Verification)
  5. 使用Fiddler截断更改Request数据
  6. 关于设置border的小技巧
  7. yuv422/yuv420格式
  8. Linux读写锁的使用
  9. 从状态转移看:载波侦听多路访问/冲突避免(CSMA/CA)
  10. UVAlive3713 Astronauts(2-SAT)
  11. xcode UIImageView创建、图片加载、 音频文件播放、 延迟调用
  12. Educational Codeforces Round 15_D. Road to Post Office
  13. .NET中的repeater简介及分页效果
  14. Android 任何位置的可移动悬浮窗
  15. js定时器让动画隔秒运动
  16. laravel部署创建新项目 助记
  17. Oauth2.0 QQ&amp;微信&amp;微博实现第三方登陆
  18. Selenium上传文件方法总结
  19. elementUI 表格设置表头样式
  20. CentOS最小化安装(一)

热门文章

  1. linux系统中的单引号和双引号
  2. spring4-3-AOP-AspectJ注解-01-简单使用
  3. Python binascii
  4. 十万个为什么:现在还没发现“虚函数virtual”和多态性的优点,估计是因为我还没有编程序吧。
  5. javascript总结44: DOM对象的dataset属性方式
  6. 用Word 写csdn blog
  7. SSH2免密码登录OpenSSH
  8. sql 两大类 DDL数据定义语言 和DCL数据控制语言
  9. Jquery 欲绑定事件
  10. JavaScript - this详解 (三)