小P的牧场
【题目描述】
背景:小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
【样例解释】
选取牧场1,3,4 建立控制站,最小费用为2+( 2 + 1 * 1 ) + 4 = 9。
数据范围与约定
对于10%的数据,1 <= n <= 10
对于30%的数据,1 <= n <= 1000
对于100%的数据,1 <= n <= 1000000 , 0 < ai,bi <= 10000

分析:

经过思考可以得到这样一个式子

f[i,1]表示在第i个牧场建站且右边的牧场已全部控制的最小费用,f[i,0]表示第i个牧场未建站而从i到n的牧场都被控制的最小代价,倒着来进行处理。

f[i,1]:=min(f[i+1,1],f[i+1,0])+a[i];

f[i,0]:=min(f[j,1]+t); (i:=n..1,i<j<n)

其中t表示i..j-1的牧场被j控制的总代价,在动规循环同时求出,这样要用三层循环,显然这个效率并不好。

对DP进行改进,将牧场排列倒过来,同时改进f,f[i]表示在第i个牧场建站并之前的牧场都被控制的最小总代价,我们增加一个牧场n+1,令其建站和被控制代价为0。则有:

f[i]:=min(f[j]+t)+a[i];(i:=1..n+1,1<=j<i) 其中t表示j+1..i-1的牧场都被控制的总代价,求t可以采用一个很好地方法:

令s[i]表示1..i的a数组元素和,u[i]表示1..i的s数组元素和:

t=s[i-1]-s[j]+s[i-1]-s[j+1]+...+s[i-1]-s[i-2]

=s[i-1]*(i-j-1)-(s[j]+s[j+1]+s[j+2]+..+s[i-2])

=s[i-1]*(i-j-1)-(u[i-2]-u[j-1])

于是得到:

f[i]:=min(f[j]+s[i-1]*(i-j-1)-(u[i-2]-u[j-1]))+a[i];

时间效率为O(n^2),这样还不够,于是进行斜率优化,要注意向队列添加元素时队内最少元素数目不低于2个,我就在这里处理错了导致之前一直没AC。

代码:

program pasture;
var
f:array[..]of int64;
a,b,u,s,q:array[..]of int64;
n,m,t,k,h,j:int64; i:longint;
function min(x,y:int64):int64;
begin
if x<y then min:=x else min:=y;
end;
function cal1(x,y:longint):int64;
begin
exit(f[x]-f[y]+u[x-]-u[y-]);
end;
function cal2(x,y:longint):int64;
begin
exit(x-y);
end;
begin
readln(n);
for i:=n downto do
read(a[i]);
readln;
for i:=n downto do
read(b[i]);
for i:= to n do
s[i]:=s[i-]+b[i];
for i:= to n do
u[i]:=u[i-]+s[i];
f[]:=a[]; q[]:=; h:=; t:=;
for i:= to n+ do
begin
while (h<t)and(cal1(q[h+],q[h])<s[i-]*cal2(q[h+],q[h])) do inc(h);
j:=q[h];
f[i]:=f[j]+s[i-]*(i-j-)-(u[i-]-u[j-])+a[i];
while (t-h>=)and(cal1(i,q[t])*cal2(q[t],q[t-])<=cal1(q[t],q[t-])*cal2(i,q[t])) do dec(t);
t:=t+; q[t]:=i;
end;
writeln(f[n+]);
end.

BZOJ 3437:小P的牧场(DP+斜率优化)的更多相关文章

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

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

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

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

  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

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

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

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

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

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

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

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

  8. BZOJ 3437: 小P的牧场

    传送门 显然考虑 $dp$,设 $f[i]$ 表示前 $i$ 个牧场都被控制的最小代价 那么枚举所有 $j<i$ ,$f[i]=f[j]+val[i][j]+A[i]$ $val[i][j]$ ...

  9. BZOJ 1010: [HNOI2008]玩具装箱toy [DP 斜率优化]

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9812  Solved: 3978[Submit][St ...

  10. BZOJ 1911: [Apio2010]特别行动队( dp + 斜率优化 )

    sum为战斗力的前缀和 dp(x) = max( dp(p)+A*(sumx-sump)2+B*(sumx-sump)+C )(0≤p<x) 然后斜率优化...懒得写下去了... ------- ...

随机推荐

  1. POJ 2010 Moo University - Financial Aid(堆维护滑窗kth,二分)

    按照score排序,贪心,从左到右用堆维护并且记录前面的最小N/2个花费之和. 然后从右向左枚举中位数,维护N/2个数之和加上并判断是否满足条件.(stl的队列没有clear(),只能一个一个pop. ...

  2. hdu1213-How Many Tables---基础并查集

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1213 题目大意: 今天是Ignatius的生日,他邀请了许多朋友.现在是吃晚饭的时间,Ignatiu ...

  3. 【洛谷3157】[CQOI2011] 动态逆序对(CDQ分治)

    点此看题面 大致题意: 给你一个从\(1\)到\(n\)的排列,问你每次删去一个元素后剩余的逆序对个数. 关于\(80\)分的树套树 为了练树套树,我找到了这道题目. 但悲剧的是,我的 线段树套\(T ...

  4. CSS布局--垂直水平居中

    ···设置两个盒子 <div class="parent"> <div class="child"> </div></ ...

  5. Beyond Compare在Mac下永久试用

    转自 作者:忆如初 链接:https://www.jianshu.com/p/596b4463eacd 来源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处. 亲测可用 一. ...

  6. Date.prototype.Format---对Date的扩展

    // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占 ...

  7. oracle insert用法总结

    总结下Oracle 中的Insert用法   1.标准Insert --单表单行插入   语法:     INSERT INTO table [(column1,column2,...)] VALUE ...

  8. C语言实例解析精粹学习笔记——44(冒泡排序)

    冒泡排序,从序列的最后一个元素与前一个元素比较大小,如果R[n-1]>R[n]则交换两个元素的位置(R[0]作为临时存放区)将最小的数据交换到R[1],第二次循环将第二小的数交换到R[2].通过 ...

  9. HDU1272小希的迷宫

    小希的迷宫 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一 ...

  10. vue2.x生命周期

    vue2.x生命周期 1. beforeCreate 在实例初始化之后,数据观测(data observer) 和 event/watcher 事件配置之前被调用. 2. created 实例已经创建 ...