BZOJ 3437 小P的牧场(斜率优化DP)
【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=3437
【题目大意】
n个牧场排成一行,需要在某些牧场上面建立控制站,
每个牧场上只能建立一个控制站,每个控制站控制的牧场
是它所在的牧场一直到它西边第一个控制站的所有牧场
它西边第一个控制站所在的牧场不被控制,如果它西边不存在控制站,
那么它控制西边所有的牧场,每个牧场被控制都需要一定的花费,
而且该花费等于它到控制它的控制站之间的牧场数目乘上该牧场的放养量,
在第i个牧场建立控制站的花费是ai,每个牧场i的放养量是bi,
求最小总花费。
【题解】
考虑只在n建立控制站的情况,答案为∑b[i]*(n-i)
记dp[i]为考虑了i到n的情况,并且在i点建立了控制站的最优情况,
有dp[i]=max{dp[j]+sum[i]*(j-i)}-a[i]
=-a[i]-sum[i]*i+max(dp[j]+sum[i]*j)
为关于sum[i]的线性函数,那么对f(y)=x*y+dp[x]进行斜率优化
正向思路(by安琪):

【代码】
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N=1000010;
int deq[N],n;
LL tot,ans,dp[N],S[N],a[N],b[N];
LL f(int x,LL y){return y*x+dp[x];}
bool check(int f1,int f2,int f3){
LL a1=f1,b1=dp[f1];
LL a2=f2,b2=dp[f2];
LL a3=f3,b3=dp[f3];
return (a2-a1)*(b3-b2)<=(b2-b1)*(a3-a2);
}
void solve(){
for(int i=1;i<=n;i++)S[i]=S[i-1]+b[i];
int s=0,t=1;
deq[0]=n;
for(int i=n-1;i;i--){
while(s+1<t&&f(deq[s],S[i])<=f(deq[s+1],S[i]))s++;
dp[i]=-a[i]-S[i]*i+f(deq[s],S[i]);
ans=max(ans,dp[i]);
while(s+1<t&&check(deq[t-2],deq[t-1],i))t--;
deq[t++]=i;
}printf("%lld\n",tot-ans);
}
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]);
for(int i=1;i<n;i++)tot+=b[i]*(n-i);
tot+=a[n]; solve();
return 0;
}
BZOJ 3437 小P的牧场(斜率优化DP)的更多相关文章
- BZOJ 3437: 小P的牧场 斜率优化DP
3437: 小P的牧场 Description 背景 小P是个特么喜欢玩MC的孩纸... 描述 小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号),于是他就烦恼了:为了控制这n个牧场 ...
- bzoj 3437: 小P的牧场 -- 斜率优化
3437: 小P的牧场 Time Limit: 10 Sec Memory Limit: 128 MB Description 小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号), ...
- bzoj3437小P的牧场 斜率优化dp
3437: 小P的牧场 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1542 Solved: 849[Submit][Status][Discus ...
- 【bzoj3437】小P的牧场 斜率优化dp
题目描述 背景 小P是个特么喜欢玩MC的孩纸... 描述 小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号),于是他就烦恼了:为了控制这n个牧场,他需要在某些牧场上面建立控制站,每个 ...
- BZOJ3437:小P的牧场(斜率优化DP)
Description 小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号),于是他就烦恼了:为了控制这n个牧场,他需要在某些牧场上面建立控制站,每个牧场上只能建立一个控制站,每个控制 ...
- bzoj3427小P的牧场(斜率优化dp)
小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号),于是他就烦恼了:为了控制这n个牧场,他需要在某些牧场上面建立控制站,每个牧场上只能建立一个控制站,每个控制站控制的牧场是它所在的牧 ...
- BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP
1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...
- bzoj 1597 [Usaco2008 Mar]土地购买——斜率优化dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1597 又一道斜率优化dp.负数让我混乱.不过仔细想想还是好的. 还可以方便地把那个负号放到x ...
- bzoj 3437: 小P的牧场【斜率优化】
emmm妹想到要倒着推 先假设只在n建一个控制站,这样的费用是\( \sum_{i=1}^{n} b[i]*(n-i) \)的 然后设f[i]为在i到n键控制站,并且i一定建一个,能最多节省下的费用, ...
随机推荐
- cocos2dx中启用lua脚本
AppDelegate 的 applicationDidFinishLaunching 方法中加载Lua引擎 bool AppDelegate::applicationDidFinishLaunchi ...
- Tornado 安装及简单程序示例
1.安装步骤:tar xvzf tornado-3.2.tar.gz cd tornado-3.2 python setup.py build sudo python setup.py install ...
- poj 1062 昂贵的聘礼 (dijkstra最短路)
题目链接:http://poj.org/problem?id=1062 昂贵的聘礼 Time Limit: 1000MS Memory Limit: 10000K Total Submission ...
- LCD实验学习笔记(八):中断
s3c2440有60个中断源(其中15个为子中断源). 31个32位的通用寄存器,6个程序状态寄存器.有6种工作模式(系统/用户模式,快中断模式,管理模式,数据访问中止模式,中断模式,未定指令中止模式 ...
- Django rest framework + Vue简单示例
构建vue项目参考这篇文章https://segmentfault.com/a/1190000008049815 一.创建Vue项目 修改源:npm config set registry https ...
- ftrace 的使用【转】
转自:http://blog.csdn.net/wang6077160/article/details/7814279 ftrace 的使用 ftrace 在内核态工作,用户通过 debugfs 接口 ...
- FIS3 大白话【一】
1.fis3可以用fis.set进行一些全局的配置,包括忽略文件.文件后缀处理类型.源码过滤等等,用fis3.get可以得到配置信息,详见: http://fis.baidu.com/fis3/doc ...
- 集合类---set
定义:一个不包含重复元素的collection.set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素,不保证集合里元素的顺序. 方法使用详解: 1 ...
- hihocoder 1145 : 幻想乡的日常
#1145 : 幻想乡的日常 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 幻想乡一共有n处居所,编号从1到n.这些居所被n-1条边连起来,形成了一个树形的结构. 每处 ...
- Largest Number——STL的深层理解
Given a list of non negative integers, arrange them such that they form the largest number. For exam ...