题目是一个很典型的斜率优化的题目。题意就不说了。

是这样的,对于双端优先队列,我们共有队首和队尾两个删除操作,来保证对于任意一个i,第一个元素都是最优的。

我们把dp的转移方程列出来就直达其状态为f[i]=min(f[j]+(a[i]-a[j+1])^2+m)。

所以我们如果有j1<j2且j2优于j1,那么一定有2*a[i]*(a[j2+1]-a[j1+1])>=f[j2]-f[j1]+a[j2+1]-a[j1+1]。同时由于等式两边都是正数而且随着i的增大,a[i]也是变大的,所以只要等式一旦成立,那么对于后面的每一个a[i],都是成立的,所以此时说明j1这个元素已经没有用了,因为它一定不会是后面的最优解。所以可以从对首删除,这样我们就完成了对首的操作。

接下来稍微难一点的是队尾的的操作。是这样的,假如当前我们需要加入i这个元素,我们再加入前对队尾倒数第二个,倒数第一个和i分别进行比较,分别记为j1,j2,i。

显然一定存在一个 x1使得j2由于j1,也一定存在一个x2使得i由于j2,这样我们只要比较一下x1和x2的大小就知道该怎么操作了。

什么意思呢?如果存在x1>=x2,也就说还没等到j2由于j1,i就已经优于j2了,那么显然j2也是无用的应该从队尾删除。

然后加入当前的元素i。这样我们又一次保证了队列中间的单调性。

恩,就是这样的,上代码吧 。。。  代码效率很低,求大神指教。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long
#define maxn 1000100
using namespace std; ll a[maxn],f[maxn],q[maxn];
ll n,m,head,tail;
ll xx,yy,xx1,yy1; ll dy(ll j1,ll j2) { return f[j2]-f[j1]+a[j2+]*a[j2+]-a[j1+]*a[j1+]; } ll dx(ll j1,ll j2) { return *(a[j2+]-a[j1+]); } int main()
{
while (scanf("%I64d%I64d",&n,&m) && (n|m))
{
for (int i=; i<=n; i++) scanf("%I64d",&a[i]);
head=tail=,q[]=;
for (int i=; i<=n; i++)
{
while (head<tail)
{
xx=dx(q[head],q[head+]);
yy=dy(q[head],q[head+]);
if (xx*a[i]>=yy) head++;
else break;
}
f[i]=f[q[head]]+(a[i]-a[q[head]+])*(a[i]-a[q[head]+])+m;
while (head<tail)
{
xx=dx(q[tail-],q[tail]);
yy=dy(q[tail-],q[tail]);
xx1=dx(q[tail],i);
yy1=dy(q[tail],i);
if (yy*xx1>=yy1*xx) tail--;
else break;
}
q[++tail]=i;
}
printf("%I64d\n",f[n]);
}
return ;
}

最新文章

  1. Android WiFi密码(查看工具)
  2. 《精通C#》索引器与重载操作符(11.1-11.2)
  3. emulator: ERROR: x86 emulation currently requires hardware acceleration!
  4. Java Hour 36 Weathre ( 9 ) struts2 &ndash; exception
  5. vs2013 visual studio 插件安装
  6. Nginx基础知识之——配置文件信息(检查配置文件是否正确)
  7. 数据结构-AVL树的旋转
  8. 数理方程:Fourier级数
  9. 通过文件读写方式实现Matlab和Modelsim的联合仿真
  10. 《C和指针》章节后编程练习解答参考——6.6
  11. 非正确使用浮点数据由项目产生BUG讨论的问题
  12. php集成环境和自己配置的区别,php集成环境、php绿色集成环境、php独立安装版环境这三者的区别
  13. SASL - 简单认证和安全层
  14. iOS 图片裁剪 + 旋转
  15. 第 4 章 MySQL 安全管理
  16. miracl去除某些特殊信息
  17. Html5学习之旅-html5的留言记事本开发(17)
  18. web scraper——安装【一】
  19. SSM是什么框架?
  20. 使用SQL Server连接xml接口,读取并解析数据

热门文章

  1. 20155316 2016-2017-2《Java程序设计》课程总结
  2. 【待解决】关于CLASSPATH的显示问题
  3. C语言复习20170728
  4. PHP学习笔记之析构函数以及static,self,parent关键字
  5. 【转载】Ogre:Beginner Tutorial 1: SceneNode, Entity,和SceneManager 结构
  6. Luogu2183【国家集训队】礼物
  7. 【BZOJ4698】[SDOI2008]Sandy的卡片
  8. 谈谈你对Java异常处理机制的理解
  9. 十几行代码带你用Python批量实现txt转xls,方便快捷
  10. NOIP2018出征策