Description

  L公司有N个工厂,由高到底分布在一座山上。如图所示,工厂1在山顶,工厂N在山脚。由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用。突然有一天,L公司的总裁L先生接到气象部门的电话,被告知三天之后将有一场暴雨,于是L先生决定紧急在某些工厂建立一些仓库以免产品被淋坏。由于地形的不同,在不同工厂建立仓库的费用可能是不同的。第i个工厂目前已有成品Pi件,在第i个工厂位置建立仓库的费用是Ci。对于没有建立仓库的工厂,其产品应被运往其他的仓库进行储藏,而由于L公司产品的对外销售处设置在山脚的工厂N,故产品只能往山下运(即只能运往编号更大的工厂的仓库),当然运送产品也是需要费用的,假设一件产品运送1个单位距离的费用是1。假设建立的仓库容量都都是足够大的,可以容下所有的产品。你将得到以下数据:1:工厂i距离工厂1的距离Xi(其中X1=0);2:工厂i目前已有成品数量Pi;:3:在工厂i建立仓库的费用Ci;请你帮助L公司寻找一个仓库建设的方案,使得总的费用(建造费用+运输费用)最小。

Input

  第一行包含一个整数N,表示工厂的个数。接下来N行每行包含两个整数Xi, Pi, Ci, 意义如题中所述。

Output

  仅包含一个整数,为可以找到最优方案的费用。

Sample Input

3
0 5 10
5 3 100
9 6 10

Sample Output

32

HINT

  在工厂1和工厂3建立仓库,建立费用为10+10=20,运输费用为(9-5)*3 = 12,总费用32。如果仅在工厂3建立仓库,建立费用为10,运输费用为(9-0)*5+(9-5)*3=57,总费用67,不如前者优。
  【数据规模】
  对于100%的数据, N ≤1000000。 所有的Xi, Pi, Ci均在32位带符号整数以内,保证中间计算结果不超过64位带符号整数。 

Source

Solution

  设$f[i]$表示在第$i$个工厂建仓库时前$i$个工厂的最小花费,则:

  $\displaystyle f[i]=min\left\{f[j]+\sum_{k=j+1}^{i}(c[i]-c[k])*p[k]\right\}+c[i]$

    $\displaystyle=min\left\{f[j]+c[i]*\sum_{k=j+1}^{i}p[k]-\sum_{k=j+1}^{i}c[k]*p[k]\right\}+c[i]$

  令$\displaystyle sump[i]=\sum_{j=1}^i p[j]$,$\displaystyle sumxp[i]=\sum_{j=1}^i x[j]*p[j]$,则:

  $\displaystyle f[i]=min\big\{\ f[j]+x[i]*(sump[i]-sump[j])-(sumxp[i]-sumxp[j])\ \big\}+c[i]$

  据说$f[i]$满足决策单调性,辣么这一步的证明跳过= =b

  设$j<k$且$k$比$j$优,那么最后化成的斜率式是这样的:$\displaystyle\frac{(f[k]+sumxp[k])-(f[j]+sumxp[j])}{sump[k]-sump[j]}<c[i]$

  维护下凸壳搞一搞就行了

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. int x[], p[], c[], q[];
  5. ll sump[], sumxp[], f[];
  6.  
  7. double slope(int i)
  8. {
  9. return 1.0 * (f[q[i]] + sumxp[q[i]] - f[q[i - ]] - sumxp[q[i - ]]) / (sump[q[i]] - sump[q[i - ]]);
  10. }
  11.  
  12. int main()
  13. {
  14. int n, front = , back = ;
  15. scanf("%d", &n);
  16. for(int i = ; i <= n; ++i)
  17. {
  18. scanf("%d%d%d", x + i, p + i, c + i);
  19. sump[i] = sump[i - ] + p[i];
  20. sumxp[i] = sumxp[i - ] + (ll)x[i] * p[i];
  21. }
  22. for(int i = ; i <= n; ++i)
  23. {
  24. while(front < back - && slope(front + ) < x[i])
  25. ++front;
  26. int j = q[front + ];
  27. f[i] = f[j] + x[i] * (sump[i] - sump[j]) - sumxp[i] + sumxp[j] + c[i];
  28. q[++back] = i;
  29. while(front < back - && slope(back) < slope(back - ))
  30. q[--back] = i;
  31. }
  32. printf("%lld\n", f[n]);
  33. return ;
  34. }

[BZOJ1096] [ZJOI2007] 仓库建设 (斜率优化)的更多相关文章

  1. bzoj1096[ZJOI2007]仓库建设 斜率优化dp

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5482  Solved: 2448[Submit][Stat ...

  2. BZOJ1096 [ZJOI2007]仓库建设——斜率优化

    方程: $\Large f(i)=min(f(j)+\sum\limits_{k=j+1}^{i}(x_i-x_k)*p_k)+c_i$ 显然这样的方程复杂度为$O(n^3)$极限爆炸,所以我们要换一 ...

  3. 【BZOJ1096】[ZJOI2007]仓库建设 斜率优化

    [BZOJ1096][ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司 ...

  4. bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)

    题目链接: 1096: [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L ...

  5. BZOJ 1096: [ZJOI2007]仓库建设 [斜率优化DP]

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4201  Solved: 1851[Submit][Stat ...

  6. 【BZOJ-1096】仓库建设 斜率优化DP

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3719  Solved: 1633[Submit][Stat ...

  7. 【bzoj1096】[ZJOI2007]仓库建设 斜率优化dp

    题目描述 L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天,L公司的总裁L ...

  8. P2120 [ZJOI2007]仓库建设 斜率优化dp

    好题,这题是我理解的第一道斜率优化dp,自然要写一发题解.首先我们要写出普通的表达式,然后先用前缀和优化.然后呢?我们观察发现,x[i]是递增,而我们发现的斜率也是需要是递增的,然后就维护一个单调递增 ...

  9. 洛谷P2120 [ZJOI2007]仓库建设 斜率优化DP

    做的第一道斜率优化\(DP\)QwQ 原题链接1/原题链接2 首先考虑\(O(n^2)\)的做法:设\(f[i]\)表示在\(i\)处建仓库的最小费用,则有转移方程: \(f[i]=min\{f[j] ...

随机推荐

  1. spark集成hbase与hive数据转换与代码练习

    帮一个朋友写个样例,顺便练手啦~一直在做平台的各种事,但是代码后续还要精进啊... import java.util.Date import org.apache.hadoop.hbase.HBase ...

  2. GitLab的安装及使用教程

    1.配置yum源 vim /etc/yum.repos.d/gitlab-ce.repo 复制以下内容: [gitlab-ce] name=gitlab-ce baseurl=http://mirro ...

  3. TinyMce 使用初探

    https://www.cnblogs.com/nkxyf/p/3883586.html 参考:http://www.tinymce.com/    官网 http://www.tinymce.com ...

  4. golang urlencode

    u := url.Values{} u.Set(") u.Set(") u.Set(,"mac":"38:a4:ed:fe:99:c8"}` ...

  5. Docker MySQL备份

    建立备份的MySQL容器 docker run --name mysql-back -e MYSQL_ROOT_PASSWORD=root -v /srv/mysql/backup:/mysql/ba ...

  6. Linux 上 C 程序的内存布局

    在仔细研究这个问题之前,我认为 C 程序在内存中只有代码段,堆和栈三部分构成.前几天面试被问到了这个问题,才发现自己的印象是不完全的. 在本文中通过解析析一个 C 程序中变量和函数的地址来分析 C 程 ...

  7. PHP实现WebService的简单示例和实现步骤

    首先我创建的文件有: api.php api的接口类文件 api.wsdl 我创建产生的最后要调用的接口文件 cometrue.php 注册service api类内容的所有内容的执行文件 creat ...

  8. 有关datatables的非常规教程

    有关datatables的非常规教程 1. //$.fn.dataTable.tables({ visible: true, api: true }).columns.adjust(); table. ...

  9. 一个例子理解break和continue的区别

    结论:break用于终止整个循环,而continue用于终止某一次循环.public class Test { public static void main(String[] args) { for ...

  10. Jquery就是这么简单

    什么是Jquery? Jquey就是一款跨主流浏览器的JavaScript库,简化JavaScript对HTML操作 就是封装了JavaScript,能够简化我们写代码的一个JavaScript库 为 ...