BZOJ1096 [ZJOI2007]仓库建设 动态规划 斜率优化
原文链接http://www.cnblogs.com/zhouzhendong/p/8696410.html
题目传送门 - BZOJ1096
题意
给定两个序列$a,b,X$,现在划分$a$序列。
被划分出来的段$[j,i]$的花费为$a_i+\sum_{k=j+1}^{i}(X_i-X_k)b_k$。
一种划分方式的花费就是每一段的花费之和。
问最小花费。
序列长度$\leq 10^6$。
题解
这题是BZOJ3437的升级版(其实也没升多少……,不仅代码我是几乎原样复制到,连题解我几乎都是原样复制的……)
首先我们不难写出DP方程:
$$dp_i=max\{dp_j+\sum_{k=j+1}^{i}(X_i-X_k)b_k\}+a_i\ \ \ \ \ (0\leq j<i)$$
然后容易看出可以斜率优化。
然后搬出斜率优化的套路。
先化简些式子。
$$dp_j+\sum_{k=j+1}^{i}(X_i-X_k)b_k\\=dp[j]-\sum_{k=j+1}^{i}X_kb_k+X_i\sum_{k=j+1}^{i}b_k$$
设:
$$sum_i=\sum_{j=1}^{i}b_j$$
$$vsum_i=\sum_{j=1}^{i}b_j\times X_j$$
则原式=
$$dp_j-vsum_i+vsum_j+X_isum_i-X_isum_j$$
然后开始斜率优化DP的套路部分:
设(注意$x$的大小写)
$$x_i=sum_i$$
$$y_i=dp_i+vsum_i$$
则原式=
$$y_j-vsum_i+X_isum_i-X_ix_j$$
假设$j>k$且从$j$转移不劣于$k$,则:
$$y_j-vsum_i+X_isum_i-X_ix_j\leq y_k-vsum_i+X_isum_i-X_ix_k$$
化简得:
$$\frac{y_j-y_k}{x_j-x_k}\leq X_i$$
然后献上斜率优化DP套路:
注意由于开始限制了$j>k$所以$x_j-x_k>0$,所以最后两边同时相除不等式仍然成立。
设
$$g_{i,j}=\frac{y_i-y_j}{x_i-x_j}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (i>j)$$
则上式可以表示为$g_{j,k}<X_i$
我们来发掘以下$g_{j,k}$的性质。
1. 当$g_{j,k}\leq X_i$时,由于随着$i$变大,$X_i$也变大,所以显然从$k$转移是永远不会比$j$好的,所以我们可以把$k$扔掉。
2. 当$g_{i,j}\leq g_{j,k}$时,从$i$或者$k$转移至少有一个不比$j$差,所以可以把$j$扔掉。为什么??
若$g_{i,j}\leq X_i$,显然$j$要被扔掉,根据第一个性质。
若$g_{i,j}>X_i$,则$g_{j,k}>X_i$,那么显然$j$比$k$差,也得被扔掉。
于是我们可以用一个单调队列来维护斜率的单调性。
具体的:
当情况1发生的时候让队首出队。
在进队的时候,如果发生情况2,那么先让队尾出队,然后再进队。
为了避免精度问题,我们可以把$x_i-x_j$乘上来。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1000005;
int n,q[N],head=1,tail=0;
LL a[N],b[N],X[N],sum[N],vsum[N],dp[N],x[N],y[N];
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%lld%lld%lld",&X[i],&b[i],&a[i]);
for (int i=1;i<=n;i++)
sum[i]=sum[i-1]+b[i],vsum[i]=vsum[i-1]+b[i]*X[i];
q[++tail]=0;
for (int i=1;i<=n;i++){
int j=q[head+1],k=q[head];
while (tail-head>0&&y[j]-y[k]<=(x[j]-x[k])*X[i])
head++,j=q[head+1],k=q[head];
j=k;
dp[i]=dp[j]+vsum[j]-vsum[i]+(sum[i]-sum[j])*X[i]+a[i];
x[i]=sum[i];
y[i]=dp[i]+vsum[i];
j=q[tail],k=q[tail-1];
while (tail-head>0&&(y[i]-y[j])*(x[j]-x[k])<=(y[j]-y[k])*(x[i]-x[j]))
tail--,j=q[tail],k=q[tail-1];
q[++tail]=i;
}
printf("%lld",dp[n]);
return 0;
}
BZOJ1096 [ZJOI2007]仓库建设 动态规划 斜率优化的更多相关文章
- BZOJ1096 ZJOI2007 仓库建设 【斜率优化DP】
BZOJ1096 ZJOI2007 仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般 ...
- BZOJ1096 [ZJOI2007]仓库建设(斜率优化)
题目背景 小B的班级数学学到多项式乘法了,于是小B给大家出了个问题:用编程序来解决多项式乘法的问题. 题目描述 L公司有N个工厂,由高到底分布在一座山上. 工厂1在山顶,工厂N在山脚. 由于这座山处于 ...
- BZOJ1096: [ZJOI2007]仓库建设(dp+斜率优化)
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5790 Solved: 2597[Submit][Status][Discuss] Descript ...
- 2018.09.07 bzoj1096: [ZJOI2007]仓库建设(斜率优化dp)
传送门 斜率优化dp经典题. 令f[i]表示i这个地方修建仓库的最优值,那么答案就是f[n]. 用dis[i]表示i到1的距离,sump[i]表示1~i所有工厂的p之和,sum[i]表示1~i所有工厂 ...
- [BZOJ1096][ZJOI2007]仓库建设(斜率优化DP)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1096 分析: 假设1~10,如果在3 6 10建立仓库,那么当前建立仓库决策下的最优值 ...
- BZOJ 1096: [ZJOI2007]仓库建设 动态规划 + 斜率优化
#include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) #defi ...
- 【BZOJ 1096】 [ZJOI2007]仓库建设 (斜率优化)
1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3940 Solved: 1736 Description ...
- BZOJ 1096: [ZJOI2007]仓库建设( dp + 斜率优化 )
dp(v) = min(dp(p)+cost(p,v))+C(v) 设sum(v) = ∑pi(1≤i≤v), cnt(v) = ∑pi*xi(1≤i≤v), 则cost(p,v) = x(v)*(s ...
- 【洛谷】2120:[ZJOI2007]仓库建设【斜率优化DP】
P2120 [ZJOI2007]仓库建设 题目背景 小B的班级数学学到多项式乘法了,于是小B给大家出了个问题:用编程序来解决多项式乘法的问题. 题目描述 L公司有N个工厂,由高到底分布在一座山上. 工 ...
随机推荐
- Win7开机卡在Windows Update 35%的解决办法
一台Win7老机器,多年未清理,用DISM++清理后,开机重启一直卡在Windows Update 35%转圈圈数小时,无法进入系统. 强制按关机键,F8进入安全模式依然同样现象. 查阅MSDN后,有 ...
- [MySQL]子语句的查询技巧
一.统计group by语句的行数 group by语句中,如果包含字段统计函数(诸如:count(),sum()...),这种情况下统计函数只会作用于group by的字段,因此想拿到最终结果的行数 ...
- webStorm 快捷键 + 浏览器
webStorm 快捷键 shift + enter 不管光标在哪个位置 新建一行 Ctrl + G 查找行Ctrl + B 查找函数Ctrl + D ...
- Linux 的 OOM 终结者(Out Of Memory killer)
现在是早晨6点钟.已经醒来的我正在总结到底是什么事情使得我的起床闹铃提前了这么多.故事刚开始的时候,手机铃声恰好停止.又困又烦躁的我看了下手机,看看是不是我自己疯了把闹钟调得这么早,居然是早晨5点.然 ...
- mabytis的xml一些写法
1.jdbcType=TIMESTAMP 而不是 jdbcType=DATETIME myabtis 3.4.6 版本jar包中:jdbcType枚举: ARRAY(Types.ARRAY), BIT ...
- Confluence 6 数据库整合有关你数据库的大小写敏感问题
'Collation' 是数据如何被存储和比较的规则.大小写是否敏感是有关字符集设置的一个方面.其他大小写敏感的方面有 kana (Japanese script)和宽度(单字节对比双字节长度). 设 ...
- sticky footer 模板
http://www.w3cplus.com/blog/tags/136.html http://www.w3cplus.com/css/css-sticky-foot-at-bottom-of-th ...
- nginx(一)之默认配置文件
首先是nginx.conf vim /etc/nginx/nginx.conf user nginx; // 设置nginx服务的系统使用用户 worker_processes 1; // 工作进程数 ...
- JPA核心类与使用
点击访问:JPA环境配置(一) Persistence: Persistence用于获取EntityManagerFactory实例,这个类中包含一个名为createEntityManagerFact ...
- python并发编程之多进程2-------------数据共享及进程池和回调函数
一.数据共享 1.进程间的通信应该尽量避免共享数据的方式 2.进程间的数据是独立的,可以借助队列或管道实现通信,二者都是基于消息传递的. 虽然进程间数据独立,但可以用过Manager实现数据共享,事实 ...