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位带符号整数。

分析:
满脑子的斜率优化

先说点题外话:
这个机房都在打cf,除了我,
我因为还有题可做
所以坚守bzoj,有点害怕
我在考虑下一次是不是也要参加一下(看心情吧,这次的题lxx说全是暴力,然而我刷题也和比赛差不多,不看题解)

言归正传:
一维dp
我发现这个贡献是挺难算的,
只有O1求出贡献,复杂度才合理
我觉得吧,应该把柿子弄出来,画一画

f[i]=min{f[j]+dis[i]*(sump[i-1]-sump[j])-sum[i-1]+sum[j]+c[i]}
sum[i]=Σdis[i]*p[i]

日常画柿子:

斜率优化:
1.维护双端队列
2.转移时从队首转移:队中依次有a,b,c等元素,
如果g[b][a] < len[i],a出队,直到g[x][y]>=len[i]
从y转移
3.入队时:队中依次有a,b,c等元素,待入队元素为d
如果g[d][c] < g[c][b] ,c出队
直到g[d][x]>=g[x][y] ,d入队

tip

今天大家都在和我背道而驰,弄得我很方
结果写错一个语句,还好查出来了。。。

这里写代码片
#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long longusing namespace std;const int N=1000010;
ll c[N],dis[N],p[N],f[N],sum[N];
int n,q[N],tou,wei;double get(int j,int k)
{double x1=(double)f[j]+sum[j];double x2=(double)f[k]+sum[k];return (double)(x1-x2)/(double)(p[j]-p[k]);
}void doit()
{int i,j;tou=wei=0;for (i=1;i<=n;i++){while (tou<wei&&get(q[tou+1],q[tou])<dis[i]) tou++;f[i]=f[q[tou]]+dis[i]*(p[i-1]-p[q[tou]])-sum[i-1]+sum[q[tou]]+c[i];while (tou<wei&&get(i,q[wei])<get(q[wei],q[wei-1])) wei--;q[++wei]=i;}printf("%lld",f[n]);
}int main()
{scanf("%d",&n);for (int i=1;i<=n;i++) scanf("%lld%lld%lld",&dis[i],&p[i],&c[i]);for (int i=1;i<=n;i++) {sum[i]=sum[i-1]+(p[i]*dis[i]);p[i]+=p[i-1];}doit();return 0;
}

转载于:https://www.cnblogs.com/wutongtong3117/p/7673149.html

bzoj1096 [ZJOI2007]仓库建设(斜率)相关推荐

  1. bzoj1096 [ZJOI2007]仓库建设

    [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MB Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶, ...

  2. [ZJOI2007]仓库建设(斜率优化)

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

  3. bzoj 1096: [ZJOI2007]仓库建设(斜率DP)

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 5232  Solved: 2324 [Submit][St ...

  4. 【BZOJ1096】仓库建设,斜率优化DP练习

    传送门 写在前面:前来报道的学弟 思路:这是学习斜率优化后完全自己独立处理出的第一个题吧,感觉自己还是太弱,这么就初步理解斜率优化. 先推转移方程,这个还是比较好弄得 f[i]=c[i]+min(f[ ...

  5. BZOJ 1096: [ZJOI2007]仓库建设

    传送门 斜率优化DP入门题 显然如果在一个位置 i 建一个仓库,且上一个仓库位置为 j 那么从 j+1到 i 的物品显然都要存在 i 仓库是最优的 设 $f [ i ]$ 表示在第 i 个工厂建设仓库 ...

  6. 【BZOJ 1096】[ZJOI2007]仓库建设

    [链接] 链接 [题意] 在这里输入题意 [题解] 设f[i]表示在第i个地方设立一个仓库,且前面符合要求的最小花费. 则 \(f[i] = min(f[j] + c[i] + dis[i]*(sum ...

  7. [ZJOI2007]仓库建设

    传送门 考虑用dp[i]表示把前i个地点的物品全部安置好的最小花费.因为物品只能往下运,所以当前这个位置必须建仓库,dp方程很好想: \[dp[i] = min_{j=1}^{i-1}\{dp[j] ...

  8. bzoj1096【ZJOI2007】仓库建设

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec   Memory Limit: 162 MB Submit: 3659   Solved: 1602 [ Submit] ...

  9. 【斜率优化】仓库建设(luogu 2120)

    仓库建设 luogu 2120 题目大意 有一个斜坡,上面有n个工厂(山顶是1,山脚是nnn,工厂都是漏填),上面有pip_ipi​个货物,和工厂1的距离为x1x_1x1​ 现在有一场大雨,你可以在某 ...

  10. BZOJ1096-[ZJOI2007]仓库建设

    BZOJ1096-[ZJOI2007]仓库建设 题意: 题解: 斜率优化dp.为啥我做过的斜率优化题没有一道是1A的???还有这道题并不难,就当我试一下mathjax吧. 我们设$tot_{i}=\s ...

最新文章

  1. Atitit. Async await 优缺点 异步编程的原理and实现 java c# php
  2. net::ERR_INCOMPLETE_CHUNKED_ENCODING
  3. 清华大学金涛:《数据安全分级划分》
  4. 独家 | 一文带你读懂特征工程!
  5. Java-Web JSP指令、javabean和EL表达式
  6. MySQL通过存储过程使用循环结构循环创建数据,以及批量数据的导入导出
  7. postman发送object_.NetCore HttpClient发送请求的时候为什么自动带上了一个RequestId头部...
  8. bootstrap设置button不显示_电脑便签怎么显示不关闭?电脑云便签敬业签怎么设置显示桌面?...
  9. 【Net Core系列】(前言).net core学习笔记
  10. DNS 域名解析系统:CNAME 记录的作用是?
  11. [渝粤教育] 郑州科技学院 数控加工技术 参考 资料
  12. 进了小公司的应届程序员如何翻身进入大公司?
  13. 梅特勒托利多电子秤显示EEP服务器错误,托利多电子秤故障排除和维修方法
  14. mx150 宏碁swift3_大众化的轻薄本-宏碁蜂鸟Swift 3评测报告
  15. telnet不是内部或外部命令
  16. Win10新加内存条后可用内存没增加解决方案
  17. 本周比赛一些感想(5.25~5.31)
  18. 思科模拟器:通过一台三层交换机及两台二层交换机和6台电脑划分3个VLAN,并建立三个网关让电脑之间互通
  19. 基于FPGA的多功能数字时钟设计报告
  20. 【Docker篇】Docker的基本组成,底层原理分析

热门文章

  1. 三国演义人物出场统计代码含义_用python分析小说人物关系(二)——实战篇
  2. 论文用impact、effect、influence 什么区别
  3. Go语言学习路线图 初阶+中阶+高阶
  4. C++ const和static const的区别
  5. 计算机主板电池,如何更换计算机主板电池
  6. LayaAir UI 组件 # CheckBox 复选框
  7. FixedLengthFrameDecoder 固定长度解码器,解决 TCP 粘包
  8. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_14-异常处理-异常处理的问题分析...
  9. 阶段3 1.Mybatis_09.Mybatis的多表操作_5 完成user的一对多查询操作
  10. 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第5节 使用骨架创建maven的java工程_16maven工程servlet实例之jar包冲突...