【解题思路】

  预处理spi=∑pj(j∈[1,i]),si=si-1+(xi-xi-1)*spi-1表示把工厂1~i-1的产品都运到工厂i的花费。于是把工厂j+1~i的产品都运到工厂i的花费为si-sj-spj*(xi-xj)。

  于是易得转移方程:f[i]=min{f[j]+s[i]-s[j]-sp[j]*(x[i]-x[j])+c[i]},转移成同的形式:((f[j]-s[j]+sp[j]*x[j])-(f[k]-s[k]+sp[k]*x[k]))/(sp[j]-sp[k])<x[i]。

  因为较优转移方式为min,所以维护一个下凸壳即可。听说题目并没有保证x升序?(可能是我星际)所以假装要先排下序,复杂度O(nlog2n)。

【参考代码】

 #include <algorithm>
#define range(i,low,high) for(register int i=(low);i<(high);++i)
#define dange(i,high,low) for(register int i=(high);i>(low);--i)
#define __function__(type) __attribute__((optimize("-O2"))) inline type
#define __procedure__ __attribute__((optimize("-O2"))) inline void
using namespace std; //quick_io {
#include <cctype>
#include <cstdio> __function__(long long) getint()
{
char c=getchar(); for(;!isdigit(c)&&c!='-';c=getchar());
short s=; for(;c=='-';c=getchar()) s*=-; long long r=;
for(;isdigit(c);c=getchar()) r=(r<<)+(r<<)+c-''; return r*s;
}
//} quick_io struct node
{
long long x,p,c;
__procedure__ input() {x=getint(),p=getint(),c=getint();}
__function__(bool) operator<(const node&t)const{return x<t.x;}
}factory[]; int q[]; long long s[]={},sp[]={},f[]; __function__(long long) getDP(const int&i,const int&j)
{
return f[j]+s[i]-s[j]-sp[j]*(factory[i].x-factory[j].x)+factory[i].c;
}
__function__(long long) getUP(const int&j,const int&k)
{
return f[j]-f[k]-s[j]+s[k]+sp[j]*factory[j].x-sp[k]*factory[k].x;
}
__function__(long long) getDOWN(const int&j,const int&k)
{
return sp[j]-sp[k];
} int main()
{
int n=getint(); range(i,,n+) factory[i].input();
range(i,,n+)
{
s[i]=s[i-]+(factory[i].x-factory[i-].x)*sp[i-];
sp[i]=sp[i-]+factory[i].p;
}
int head=,tail=; sort(factory+,factory+n+),f[]=;
range(i,,n+)
{
for(;head+<tail&&
getUP(q[head+],q[head])<factory[i].x*getDOWN(q[head+],q[head]);
++head
);
f[i]=getDP(i,q[head]);
for(;head+<tail&&
getUP(i,q[tail-])*getDOWN(q[tail-],q[tail-])<
getUP(q[tail-],q[tail-])*getDOWN(i,q[tail-]);
--tail
);
q[tail++]=i;
}
return printf("%lld\n",f[n]),;
}

最新文章

  1. 弹出iframe内嵌页面元素到父页面并全屏化
  2. [deviceone开发]-do_ImageView实现正圆的示例
  3. 通过GET方法返回定义的任意对象
  4. appcan切换帐号无法提交SVN
  5. HTML5移动Web开发(五)——移动设计之CSS媒介查询
  6. Android安全机制(2) Android Permission权限控制机制
  7. codeforces 446C DZY Loves Fibonacci Numbers(数学 or 数论+线段树)(两种方法)
  8. LitDB文章
  9. 从零开始学ios开发(七):Delegate,Action Sheet, Alert
  10. C#01
  11. 编写isNull isArray isFunction的方法
  12. 2440裸 Delay(); 和 while(!(rUTRSTAT0 &amp;amp; 0x2)); 问题
  13. FreeRTOS源代码的编程标准与命名约定
  14. ConcurrentHashMap1.8源码分析
  15. SD卡
  16. AndroidStudio打包apk,安装出现签名冲突--解决办法
  17. IPython介绍
  18. MySQL中的IFNULL,IF,NULLIF函数
  19. WebDriverAPI(3)
  20. SVN中Revert changes from this revision 跟Revert to this revision

热门文章

  1. 2、Python 基础类型 -- String 字符串类型
  2. UDP协议解析 以及和TCP协议的区别
  3. rest_framework框架实现之(视图,路由,渲染器)
  4. Java中的LinkedHashSet
  5. layer.msg的使用
  6. d3js 折线图+柱图
  7. 模数循环节——cf547A
  8. [bzoj3073] Journeys 题解(线段树优化建图)
  9. CSS:CSS 导航栏
  10. 【SQL】事务回滚