复习一下斜率优化:
令 $f_{i}$ 表示从 1 考虑到 $i$ 的最优结果.
得 $f_{i}=min${ $f_{j}+(sum_{i}-sum_{j}+i-j-1-L)^{2}$}
如果直接枚举,是 $O(n^{2})$ 的,太慢了!!!
考虑斜率优化:
令 $k<j$,考虑什么时候 $j$ 比 $k$ 优:
$fj​+(sumi​−sumj​+i−j−1−L)^{2}<fk​+(sumi​−sumk​+i−k−1−L)^{2}$
令 $a_{i}=sum_{i}+i$ ,$b_{i}=sum_{i}+i+1+L$ (为了简化计算)
得: $f_{j}+(a_{i}-b_{j})^{2}<f_{k}+(a_{i}-b_{k})^{2}$
化简一下,得:$\frac{f_{j}+b_{j}^{2}-(f_{k}+b_{k}^{2})}{b_{j}-b_{k}}<2\times a_{i}$
令 $g[x]=f_{x}+b_{x}^{2}$
上面式子为 $\frac{g_{j}-g_{k}}{b_{j}-b{k}}$,看上去是不是很熟悉 ?
这不就是一次函数斜率得形式嘛......
可以把 $j,k$ 都看作二维平面上的点 $(b_{j},g_{j})$ 与 $(b_{k},g_{k})$
那么, $j$ 的答案优于 $k$ 是在二者得斜率小于 $2\times a_{i}$ 的情况下成立的.
所以说,我们要求的 $j$ 就是编号最大的与前一个点的斜率小于 $2a_{i}$ 的值. 
手画一下,发现这道题中我们要维护的其实就是一个下凸包.
根据我们每一次的斜率 $2\times a_{i}$,不难发现这个东西是单调递增的,所以当我们找到答案 $tmp$ 时,$tmp$ 前的所有点就都变成无用点,直接弹掉即可.
而每一次新加入一个点,就顺便维护凸包的形状,将不合法的点从队尾弹出即可.     
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 100000 + 123;
long long s[maxn], f[maxn];
int l, n, q[maxn];
inline long long re_x(int i){ return s[i]; }
inline long long re_y(int i){ return f[i] + (s[i] + l) * (s[i] + l); }
inline double get_slope(int i,int j){return (double)(re_y(i) - re_y(j)) / (re_x(i) - re_x(j)); }
int main()
{
scanf("%d%d",&n,&l);
for(int i = 1;i <= n; ++i) scanf("%lld",&s[i]), s[i] += s[i-1];
for(int i = 1;i <= n; ++i) s[i] += i;
int head = 0, tail = 0;
for(int i = 1;i <= n; ++i)
{
while(head < tail && get_slope(q[head], q[head + 1]) < 2 * s[i] ) ++ head;
f[i] = f[q[head]] + (s[i] - s[q[head]] - 1 - l) * (s[i] - s[q[head]] - 1 - l);
while(tail > head && get_slope(q[tail], i) < get_slope(i, q[tail - 1])) --tail;
q[++tail] = i;
}
printf("%lld",f[n]);
return 0;
}

  

最新文章

  1. 和阿文一起学H5——如何搜到超酷的GIF素材
  2. mysql数据类型介绍
  3. beta分布
  4. graph isomorphism 开源算法库VFlib, Nauty
  5. PHP加密解密函数(带有效期,过了有效期也解不了)
  6. drf相关问题
  7. elementUI vue upload完整示例
  8. Linux提示删除文件cannot remove `文件名&#39;: Operation not permitted
  9. Java课程寒假之开发记账本软件(网页版)之一
  10. rsync 定时备份&lt;crontab+backrsync.sh&gt; 简陋版
  11. Linux 设备树的解释 - DTB文件格式【转】
  12. 聚类算法——KMEANS算法
  13. Tomcat9.0环境搭建与源码编译
  14. 阿里云RDS的mysql数据库占用空间超过90%的处理
  15. C# WinForm下,隐藏主窗体的方法
  16. C++程序设计入门 之常量学习
  17. 【枚举&amp;数据结构】【P2484】 [SDOI2011]打地鼠
  18. UVA 10474 (13.08.04)
  19. win7系统下用vspd软件进行串口编程实例
  20. laravel中间件简单使用

热门文章

  1. android 下载网络图片并缓存
  2. web跨域通信问题解决
  3. firefox历史版本下载地址
  4. (30)导入时如何定制spring-boot依赖项的版本【转载】【从零开始学Spring Boot】
  5. (11)Spring Boot配置ContextPath【从零开始学Spring Boot】
  6. POJ 1984
  7. Android之——自己主动挂断电话的实现
  8. Openstack针对nova,cinder,glance使用ceph的虚拟机创建机制优化
  9. JAVA小程序:和电脑猜拳
  10. 寻找不到iframe元素