link

试题分析

一道斜率优化的dp

易得方程$f[j]=(S+t[i])\times c[j]+f[i]-t[i]\times c[i]+s\times c[n]$,为什么要写成这要,因为这样其实就可以将$min$拆掉,并且是一个函数形式,$(S+t[i])$为斜率,$f[i]-t[i]\times c[i]+s\times c[n]$为截距。

并且当我们要决策$i$用哪一个j时,我们会发现斜率是一样的,就只有截距会不同。所以我们要让截距越短。

所以发现当斜率为上升时,即为下凸壳的形式,所以我们可以用单调队列去优化

但是$t$有可能是负数,我们将线进行平移的时候要保证此点之前的斜率都小于$k$,之后全大于$k$,所以需要二分找到此区间

20181216 update:

为什么当截距最短是会取到$min{f[i]}$,因为$f[i]-t[i]\times c[i]+s\times c[n]$这个式子中$-t[i]\times c[i]+s\times c[n]$是定值,而又因为$f[i]$是$+f[i]$,所以只需要维护最小值即可。

但当截距出现$-f[i]$时,就必须让截距最大了,要维护的是一个上凸壳。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<climits>
#define int long long
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
const int N=;
int l,r,num[N];
int f[N],t[N],c[N],S,n,que[N];
int query(int pos,int X){
int L=l,R=r,maxn=;
int mid;
while(L<=R){
mid=L+R>>;
if(f[que[mid+]]-f[que[mid]]<=X*(c[que[mid+]]-c[que[mid]])) L=mid+,maxn=max(maxn,mid);
else R=mid-;
}
return que[maxn+];
}
signed main(){
n=read(),S=read();
for(int i=;i<=n;i++) t[i]=t[i-]+read(),c[i]=c[i-]+read();
l=,r=;f[]=;
for(int i=;i<=n;i++){
int H=query(i,S+t[i]);
f[i]=f[H]-(S+t[i])*c[H]+t[i]*c[i]+S*c[n];
while(l<r&&(f[que[r]]-f[que[r-]])*(c[i]-c[que[r]])>=(f[i]-f[que[r]])*(c[que[r]]-c[que[r-]])) r--;
que[++r]=i;
}printf("%lld\n",f[n]);
return ;
}

最新文章

  1. fir.im Weekly - 聊聊 Google 开发者大会
  2. Struts2总结
  3. Hadoop MapReduce编程 API入门系列之薪水统计(三十一)
  4. linux 禁ping本机方法
  5. JavaScript 上万关键字瞬间匹配——借助Hash表快速匹配
  6. asp.net mvc3.0第一个程序helloworld开发图解
  7. (七)学习MVC之CodeFirst迁移更新数据库
  8. Html笔记(二)字体
  9. Error Domain=com.google.greenhouse Code=-102
  10. MySQL和Oracle开发差异
  11. 类 java.util.Scannar方法
  12. Java基础之String类
  13. 用DOS命令来运行Java代码
  14. crontab的使用方法
  15. python_18_反射
  16. 高可用Redis(五):瑞士军刀之慢查询,Pipeline和发布订阅
  17. 代码规范mark一下
  18. banner
  19. 《Java程序设计》 第二周学习总结
  20. 基于mindwave脑电波进行疲劳检测算法的设计(1)

热门文章

  1. cf#516A. Make a triangle!(三角形)
  2. hdu1527取石子游戏(威佐夫博弈)
  3. selenium,unittest——参数化url,并多线程加快脚本运行速度
  4. UnityShader - 模拟动态光照特效
  5. GIT: 分布式开发 代码管理工具使用命令大全
  6. vue-router爬坑记
  7. 《Effective C++》读书笔记 条款03 尽可能使用const 使代码更加健壮
  8. 【shell 练习1】编写Shell条件句练习
  9. opencv打开视频文件出错
  10. 图的遍历——DFS(邻接矩阵)