原文链接http://www.cnblogs.com/zhouzhendong/p/8696321.html

题目传送门 - BZOJ3437

题意

  给定两个序列$a,b$,现在划分$a$序列。

  被划分出来的段$[j,i]$的花费为$a_i+\sum_{k=j+1}^{i}(i-k)b_k$。

  一种划分方式的花费就是每一段的花费之和。

  问最小花费。

  序列长度$\leq 10^6$。

题解

  首先我们不难写出DP方程:

  $$dp_i=max\{dp_j+\sum_{k=j+1}^{i}(i-k)b_k\}+a_i\ \ \ \ \ (0\leq j<i)$$

  然后容易看出可以斜率优化。

  然后搬出斜率优化的套路。

  先化简些式子。

  $$dp_j+\sum_{k=j+1}^{i}(i-k)b_k\\=dp[j]-\sum_{k=j+1}^{i}kb_k+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 j$$

  则原式=

  $$dp_j-vsum_i+vsum_j+isum_i-isum_j$$

  然后开始斜率优化DP的套路部分:

  设

  $$x_i=sum_i$$

  $$y_i=dp_i+vsum_i$$

  则原式=

  $$y_j-vsum_i+isum_i-ix_j$$

  假设$j>k$且从$j$转移不劣于$k$,则:

  $$y_j-vsum_i+isum_i-ix_j\leq y_k-vsum_i+isum_i-ix_k$$

  化简得:

  $$\frac{y_j-y_k}{x_j-x_k}\leq 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}<i$

  我们来发掘以下$g_{j,k}$的性质。

  1. 当$g_{j,k}\leq i$时,由于随着$i$变大,$i$也变大,所以显然从$k$转移是永远不会比$j$好的,所以我们可以把$k$扔掉。

  2. 当$g_{i,j}\leq g_{j,k}$时,从$i$或者$k$转移至少有一个不比$j$差,所以可以把$j$扔掉。为什么??

    若$g_{i,j}\leq i$,显然$j$要被扔掉,根据第一个性质。

    若$g_{i,j}>i$,则$g_{j,k}>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],sum[N],vsum[N],dp[N],x[N],y[N];
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%lld",&a[i]);
for (int i=1;i<=n;i++){
scanf("%lld",&b[i]);
sum[i]=sum[i-1]+b[i];
vsum[i]=vsum[i-1]+b[i]*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])*i)
head++,j=q[head+1],k=q[head];
j=k;
dp[i]=dp[j]+vsum[j]-vsum[i]+(sum[i]-sum[j])*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;
}

  

BZOJ3437 小P的牧场 动态规划 斜率优化的更多相关文章

  1. bzoj3437 小P的牧场(斜率优化dp)

    3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2025  Solved: 1110[Submit][Status][Discu ...

  2. BZOJ3437 小P的牧场 【斜率优化dp】

    3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1502  Solved: 836 [Submit][Status][Disc ...

  3. 【BZOJ-3437】小P的牧场 DP + 斜率优化

    3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 705  Solved: 404[Submit][Status][Discuss ...

  4. BZOJ 3437 小P的牧场(斜率优化DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3437 [题目大意] n个牧场排成一行,需要在某些牧场上面建立控制站, 每个牧场上只能建 ...

  5. bzoj 3437: 小P的牧场【斜率优化】

    emmm妹想到要倒着推 先假设只在n建一个控制站,这样的费用是\( \sum_{i=1}^{n} b[i]*(n-i) \)的 然后设f[i]为在i到n键控制站,并且i一定建一个,能最多节省下的费用, ...

  6. bzoj3437小P的牧场

    bzoj3437小P的牧场 题意: n个牧场,在每个牧场见控制站的花费为ai,在该处建控制站能控制从此处到左边第一个控制站(或边界)之间的牧场.一个牧场被控制的花费等于它到控制它的控制站之间的牧场数目 ...

  7. 【学习笔记】动态规划—斜率优化DP(超详细)

    [学习笔记]动态规划-斜率优化DP(超详细) [前言] 第一次写这么长的文章. 写完后感觉对斜优的理解又加深了一些. 斜优通常与决策单调性同时出现.可以说决策单调性是斜率优化的前提. 斜率优化 \(D ...

  8. bzoj3437小P的牧场 斜率优化dp

    3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1542  Solved: 849[Submit][Status][Discus ...

  9. BZOJ3437:小P的牧场(斜率优化DP)

    Description 小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号),于是他就烦恼了:为了控制这n个牧场,他需要在某些牧场上面建立控制站,每个牧场上只能建立一个控制站,每个控制 ...

随机推荐

  1. ubuntu 精简配置

    是这样的情况,在windows 7的vm虚拟机上装了Ubuntu 12.04 Desktop,主要是想用它的gui, 所以把不要的给删了. sudo apt-get -y --auto-remove ...

  2. php学习随笔--定时触发

    PHP访问接口方法:

  3. swift 实践- 01 -- UItableView的简单使用

    import UIKit class ViewController: UIViewController ,UITableViewDelegate,UITableViewDataSource{ over ...

  4. Oracle12c 的安装教程图解(安装系统:windows 2008R2)

    Oracle12c 的安装教程图解(安装系统:windows 2008R2) 第一节 安装和下载路径 1   官方下载路径: http://www.oracle.com/cn/products/dat ...

  5. Confluence 6 管理协同编辑 - 修改你的 Synchrony 配置

    你不能通过 Confluence UI 修改 Synchrony 的配置.配置的修改是通过系统属性进行修改的.在绝大部分情况下,你不需要对默认的配置进行修改.  修改 Synchrony 运行的端口. ...

  6. 设置 Confluence 6 日志

    Confluence 使用的是 Apache's log4j 日志服务.能够允许管理员通过编辑配置文件来控制日志的表现和日志输出文件.在系统中有 6 个日志输出级别,请参考 log4j logging ...

  7. clock gen sdk 代码笔记

    int ClockConfig(void) { u32 DIVCLK_DIVIDE = 10; u32 CLKFBOUT_MULT = 53; u32 CLKFBOUT_FRAC = 625; u32 ...

  8. 10,关于在vs2017中的netcore项目使用BundlerMinifier 配置问题

    查阅资料 https://github.com/madskristensen/BundlerMinifier/issues/230 今天下载了vs2017 rc 创建了个netcore的web项目,突 ...

  9. 解决kali linux 升级后安装w3af 问题

    1.在kali linux 下安装w3af 会出现很多问题,因为新版的kaliLinux ,以及python 环境的配置问题和 库的安装问题会出现很多报错 kali linux环境一般都自带git安装 ...

  10. MySQL5.7.20报错Access denied for user 'root'@'localhost' (using password: NO)

    在centos6.8上源码安装了MySQL5.7.20,进入mysql的时候报错如下: 解决办法如下: 在mysql的配置文件内加入: vim  /etc/my.cnf skip-grant-tabl ...