题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1096

设 f[i] 为 i 作为最后一个仓库时前 i 个工厂的答案,最后的答案当然是 f[n];

f[i] = min{ f[j] + ∑(j+1<=k<=i)p[k]*(x[i]-x[k]) + c[i] } , 1<=j<i

令 s[i] = ∑(1<=j<=i)p[j],t[i] = ∑(1<=j<=i)p[j]*x[j]

则 f[i] = min{ f[j] + x[i]*(s[i]-s[j]) - (t[i]-t[j]) + c[i] }

移项,得到 f[j] + t[j] = x[i]*s[j] - x[i]*s[i] + t[i] - c[i] + f[i]

x[i] 单增,s[j] 单增,可以看出是要维护一个下凸包。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef double db;
typedef long long ll;
int const xn=1e6+;
int n,x[xn],p[xn],c[xn],q[xn];
ll s[xn],t[xn],f[xn];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return f?ret:-ret;
}
db y(int i){return f[i]+t[i];}
db slp(int a,int b){return (y(b)-y(a))/(s[b]-s[a]);}
int main()
{
n=rd();
for(int i=;i<=n;i++)
{
x[i]=rd(),p[i]=rd(),c[i]=rd();
s[i]=s[i-]+p[i]; t[i]=t[i-]+(ll)p[i]*x[i];
}
int hd=,tl=;
for(int i=;i<=n;i++)
{
while(hd<tl&&slp(q[hd],q[hd+])<x[i])hd++;
f[i]=f[q[hd]]+(ll)x[i]*(s[i]-s[q[hd]])-t[i]+t[q[hd]]+c[i];
while(hd<tl&&slp(q[tl-],q[tl])>slp(q[tl-],i))tl--;
q[++tl]=i;
}
printf("%lld\n",f[n]);
return ;
}

最新文章

  1. I18N 国际化
  2. SQL Server 【附】创建&quot;商品管理数据库&quot;、&quot;学生选课数据库&quot;的SQL语句
  3. HDU 4638 Group 树状数组 + 思路
  4. Delphi Register
  5. 计算4000000000内的最大f(n)=n值---字符串的问题python实现(五岁以下儿童)
  6. Android面试题集合
  7. flask token认证
  8. spark DataFrame
  9. (转)flutter 新状态管理方案 Provide (一)-使用
  10. SCUCTF2018web部分wp
  11. canvas和图片互转
  12. matlab中生成随机数的相关知识
  13. django不返回QuerySets的API
  14. 树莓派raspberry Pi2 介绍
  15. vijos 1659 河蟹王国 线段树区间加、区间查询最大值
  16. kernel 3.2.0 上加入自己的板级文件
  17. Spring之HandlerInterceptor拦截器
  18. 什么是Qt Widget?
  19. 解决Vue方法中setTimeout改变变量的值无效
  20. 百万级数据库SQL优化大总结

热门文章

  1. redis主从连接不成功错误
  2. [LeedCode OJ]#85 Maximal Rectangle
  3. 从SDCard获取的图片按分辨率处理的方法
  4. C#向Sql数据库插入空值的控制
  5. maximum-depth-of-binary-tree——找出数的最大深度
  6. S3C2440 IIS操作 uda134x录放音
  7. cocos2dx3.0 对象池
  8. DDR硬件设计要点详解(包括电源部分)
  9. 如何成为一个Linux内核开发者
  10. man screen