题目描述

背景

小P是个特么喜欢玩MC的孩纸。。。

描述

小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号),于是他就烦恼了:为了控制这n个牧场,他需要在某些牧场上面建立控制站,每个牧场上只能建立一个控制站,每个控制站控制的牧场是它所在的牧场一直到它西边第一个控制站的所有牧场(它西边第一个控制站所在的牧场不被控制)(如果它西边不存在控制站,那么它控制西边所有的牧场),每个牧场被控制都需要一定的花费(毕竟在控制站到牧场间修建道路是需要资源的嘛~),而且该花费等于它到控制它的控制站之间的牧场数目(不包括自身,但包括控制站所在牧场)乘上该牧场的放养量,在第i个牧场建立控制站的花费是ai,每个牧场i的放养量是bi,理所当然,小P需要总花费最小,但是小P的智商有点不够用了,所以这个最小总花费就由你来算出啦。

输入

第一行一个整数 n 表示牧场数目

第二行包括n个整数,第i个整数表示ai

第三行包括n个整数,第i个整数表示bi

输出

只有一行,包括一个整数,表示最小花费

样例输入

4
2 4 2 4
3 1 4 2

样例输出

9


题解

斜率优化dp

设f[i]为i建立控制站时前i个的最小代价。

那么有f[i]=f[j]+∑((i-k)*b[k])+a[i] (j+1≤k≤i)

=f[j]+∑(i*b[k])-∑(k*b[k])+a[i] (j+1≤k≤i)

=f[j]+i*(sum[i]-sum[j])-(t[i]-t[j])+a[i]

其中sum[i]为b[i]的前缀和,t[i]为b[i]*i的前缀和。

整理一下即为f[j]+t[j]=i*sum[j]+f[i]-i*sum[i]+t[i]-a[i]。

这样状态转移方程就让我们转化成y=kx+b的形式,并且要求f[i]的最小值,就是求这里b的最小值。

于是维护一个下凸包即可。

#include <cstdio>
#define y(i) (f[i] + t[i])
#define x(i) sum[i]
long long f[1000010] , a[1000010] , b[1000010] , sum[1000010] , t[1000010];
int q[1000010] , l , r;
int main()
{
int n , i;
scanf("%d" , &n);
for(i = 1 ; i <= n ; i ++ )
scanf("%lld" , &a[i]);
for(i = 1 ; i <= n ; i ++ )
scanf("%lld" , &b[i]) , sum[i] = sum[i - 1] + b[i] , t[i] = t[i - 1] + b[i] * i;
for(i = 1 ; i <= n ; i ++ )
{
while(l < r && y(q[l + 1]) - y(q[l]) < (x(q[l + 1]) - x(q[l])) * i) l ++ ;
f[i] = y(q[l]) - i * x(q[l]) + i * sum[i] - t[i] + a[i];
while(l < r && (y(i) - y(q[r])) * (x(q[r]) - x(q[r - 1])) < (x(i) - x(q[r])) * (y(q[r]) - y(q[r - 1]))) r -- ;
q[++r] = i;
}
printf("%lld\n" , f[n]);
return 0;
}

【bzoj3437】小P的牧场 斜率优化dp的更多相关文章

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

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

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

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

  3. BZOJ 3437: 小P的牧场 斜率优化DP

    3437: 小P的牧场 Description 背景 小P是个特么喜欢玩MC的孩纸... 描述 小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号),于是他就烦恼了:为了控制这n个牧场 ...

  4. bzoj3427小P的牧场(斜率优化dp)

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

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

    [BZOJ3437]小P的牧场 Description 背景 小P是个特么喜欢玩MC的孩纸... 描述 小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号),于是他就烦恼了:为了控制这 ...

  6. bzoj 3437: 小P的牧场 -- 斜率优化

    3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MB Description 小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号), ...

  7. BZOJ3437 小P的牧场 动态规划 斜率优化

    原文链接http://www.cnblogs.com/zhouzhendong/p/8696321.html 题目传送门 - BZOJ3437 题意 给定两个序列$a,b$,现在划分$a$序列. 被划 ...

  8. bzoj3437小P的牧场

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

  9. bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)

    题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...

随机推荐

  1. 北京Uber优步司机奖励政策(3月4日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  2. C#学习第一阶段——语法基础

    C#是一门面向对象的编程语言.在面向对象的程序设计方法中,程序由各种相互交互的对象组成.相同种类的对象具有相同的属性,或者说是在相同的class 中的.       例如,以矩形为例,它具有高(len ...

  3. LeetCode: 56. Merge Intervals(Medium)

    1. 原题链接 https://leetcode.com/problems/merge-intervals/description/ 2. 题目要求 给定一个Interval对象集合,然后对重叠的区域 ...

  4. 三、并行流与串行流 Fork/Join框架

    一.并行流概念: 并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流. java8中将并行进行了优化,我们可以很容易的对数据进行并行操作.Stream API可以声明性的通过pa ...

  5. Linux tcpdump命令详解(分享文章)

    简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的 ...

  6. photoshop cc 2018安装破解教程(破解补丁,亲测,绝对可用)

    破解步骤说明:下载地址百度网盘,https://pan.baidu.com/s/1cWtpUesl2fms3tFwEC0MiQ 1.右键解压Adobe Photoshop CC 2018 64位这个文 ...

  7. selenium自动化之显式等待和EC(expected_conditions)模块

    很多人都有这种经历,selenium脚本当前运行没问题,过了一段时间再运行就报错了,然后过几天又好了.其中的原因估计60%的人都知道,是因为元素加载这块有问题.通常的解决方案就是加上sleep或者隐式 ...

  8. 测试开发的成长之路 - 自动化一站式平台(UI、接口)

    前言 在自动化测试过程中,随着对接的自动化需求不断增加,测试用例数量显著上升,参与自动化测试的人也越来越多,多人协作就会碰到很多问题,包括脚本.数据.版本.项目整合.持续集成等,而且也增加了后期维护的 ...

  9. Selenium安装(二)

    安装python 安装Selenium之前首先来说一下Python,python是一门动态性语言,python的编写比较灵活,简洁,开发效率高.因此以python结合selenium来进行自动化测试. ...

  10. Python 集合内置函数大全(非常全!)

    Python集合内置函数操作大全 集合(s).方法名 等价符号 方法说明 s.issubset(t) s <= t 子集测试(允许不严格意义上的子集):s 中所有的元素都是 t 的成员   s ...