题目大意:

典题

数学分析 G(a,b)<sum[i]时 a优于b

G(a,b)<G(b,c)<sum[i]时 b必不为最优

#include <bits/stdc++.h>
#define N 500005
using namespace std;
int n,m,dp[N],deq[N],sum[N];
// deq[]为单调队列 sum[]为数组的前缀和
int DP(int i,int j) {
return dp[j]+m+(sum[i]-sum[j])*(sum[i]-sum[j]);
}
int UP(int j,int k) { //yj-yk的部分
return dp[j]+sum[j]*sum[j]-(dp[k]+sum[k]*sum[k]);
}
int DOWN(int j,int k) {//xj-xk的部分
return *(sum[j]-sum[k]);
}
/*
由分析 当0<a<b<i时
若(ya-yb)/(xa-xb)<sum[i]
此处表达为G(a,b)<sum[i] 则j优于k 若存在a,b和b,c满足上述要求
即存在G(a,b)<sum[i] G(b,c)<sum[i]
若G(a,b)<G(b,c) 则b肯定不为最优点
*/
int main()
{
while(~scanf("%d%d",&n,&m)) {
sum[]=dp[]=;
for(int i=;i<=n;i++) {
int num; scanf("%d",&num);
sum[i]=sum[i-]+num;
}
int head=, tail=;
deq[tail++]=;
for(int i=;i<=n;i++) {
while(head+<tail && UP(deq[head+],deq[head])<=sum[i]
*DOWN(deq[head+],deq[head]))
head++; /// G(head+1,head)<=sum[i] 即head+1优于head 则去掉head
dp[i]=DP(i,deq[head]); // 用此时的最优head更新dp[i]
while(head+<tail && UP(i,deq[tail-])*DOWN(deq[tail-],deq[tail-])
<=DOWN(i,deq[tail-])*UP(deq[tail-],deq[tail-]))
tail--;
/// 如果此时G(i,tail-1)<=G(tail-1,tail-2)<=sum[i] 则说明tail-1对应点为可删去
deq[tail++]=i;
}
printf("%d\n",dp[n]);
}
return ;
}
/*
纠结了一下维护单调队列时为什么判断条件是<=
第一处 G(head+1,head)=sum[i] 说明 两者平等 不存在谁更优这个问题
而仍然 head++; 是因为既然两者平等 那么只要留一个就可以了
第二处 G(i,tail-1)=G(tail-1,tail-2) 说明 两者斜率相等
即 i,tail-1,tail-2 三个对应点在同一条直线上
那么 tail-1 这个点可以直接忽略 所以继续 tail--;
*/

最新文章

  1. Java程序员从笨鸟到菜鸟之(十三)java网络通信编程
  2. 工具分享——将C#文档注释生成.chm帮助文档
  3. web前端性能概述
  4. PHP webserver 之 soap wsdl
  5. (转)了解了这些才能开始发挥jQuery的威力
  6. c#获取带有汉字的字符串长度
  7. Swift中的便利构造器和构造器链
  8. Ubuntu下的用户和权限(二)
  9. SweetTips: 快意灵动的Android提示库!
  10. UNIX基础--权限
  11. hihoCoder 1252 Kejin Game
  12. Java开发笔记(六十一)Lambda表达式
  13. Redirect all output to file
  14. Linux 判断进程是否运行
  15. react-router v4 使用 history 控制路由跳转
  16. 八、启动linux内核并修改开机logo
  17. 作为一名IT从业者,你在工作和学习中,遇到哪些问题
  18. Solr相似度算法二:Okapi BM25
  19. POJ2299:Ultra-QuickSort——题解
  20. 并查集基础 模板题 hdu1232 畅通工程

热门文章

  1. Android中使用占位符
  2. NOIp2018集训test-9-22(am/pm) (联考三day1/day2)
  3. NX二次开发-获取矩阵值UF_CSYS_ask_matrix_values
  4. C++ string的大小写转换【转载】
  5. 英语影视台词---The Professor
  6. SPI 通信
  7. C#面向对象通信
  8. Spring Boot 启动,1 秒搞定!
  9. [笔记]Android开发环境配置及HelloWorld程序
  10. 转——调试寄存器 原理与使用:DR0-DR7