原文链接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. Python Redis pipeline操作

    Redis是建立在TCP协议基础上的CS架构,客户端client对redis server采取请求响应的方式交互. 一般来说客户端从提交请求到得到服务器相应,需要传送两个tcp报文. 设想这样的一个场 ...

  2. JQery插件zClip ----实现粘贴复制功能

    使用了这个插件,但是用在table,td中话,我是一个列表来的,对此使用此插件还是有点问题的?点击其中的一个会全部都被选中. <script type="text/javascript ...

  3. 用puttygen工具把私钥id_rsa转换成公钥id_rsa.ppk

    1 前言 有时候需要ppk格式的公钥,可以用putty来处理 2 步骤 1. 产生密钥 可以参考Gitlab的SSH配置(linux和windows双版本) $ ssh-keygen -t rsa - ...

  4. Webapi 跨域 解决解决错误No 'Access-Control-Allow-Origin' header is present on the requested resource 问题

    首先是web端(http://localhost:53784) 请求 api(http://localhost:81/api/)时出现错误信息: 查看控制台会发现错误:XMLHttpRequest c ...

  5. Pl/SQL 编程

    Pl/SQL 编程 一:前言 二:Pl/Sql 概述 二     ——  1: Pl/Sql块结构 [declare] --声明部分,可选 begin --执行部分,必须 [exception] -- ...

  6. Java.ftp上传下载

    1:jar的maven的引用: 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht ...

  7. VUE开发请求本地数据的配置,旧版本dev-server.js,新版本webpack.dev.conf.js

    VUE开发请求本地数据的配置,早期的vue-lic下面有dev-server.js和dev-client.js两文件,请求本地数据在dev-server.js里配置,最新的vue-webpack-te ...

  8. kali linux 更新问题

    1.使用一次更新和升级软件替换 apt-get install && apt -y full -upgrade 之后使用 reboot重启    系统,重启之后 再次使用命令   ap ...

  9. poj1155 依赖背包

    /* 依赖背包 dp[i][j]表示i结点为根的树选择j个用户时的最大剩余费用 即背包容量是j,价值是最大费用 */ #include<iostream> #include<cstr ...

  10. MySQL报错: Character set ‘utf8mb4‘ is not a compiled character set and is not specified in the ‘/usr/share/mysql/charsets/Index.xml‘ file

    由于日常程序使用了字符集utf8mb4,为了避免每次更新时,set names utf8mb4,就把配置文件改了,如下: [root@~]# vim /etc/my.cnf #my.cnf [clie ...