bzoj3437小P的牧场(斜率优化)
2017-08-08 14:57
337 查看
这题就是锯木厂那道的简化版。。只不过是每个点之间的距离都变成1了。。详见锯木厂。f[i]=min{f[j]+c[i]-c[j]-sw[i]*(i-j)| 0<=j< i}+a[i]。表示在i建控制站,上一个控制站建在j所需的最小花费。假设k1< k2且k1优于k2,则有(f[k2]-f[k1]+c[k1]-c[k2]+sw[k2]*k2-sw[k1]*k1)/(sw[k2]-sw[k1])>i。因此我们维护一个下凸曲线,保证队列中的斜率都是单增的。
#include <cstdio> #include <cstring> #define N 1000010 #define ll long long int a ,n,q ,h=0,t=1; ll c ,sw ,f ; inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f; } inline double slope(int k1,int k2){ return (f[k2]-f[k1]+c[k1]-c[k2]+sw[k2]*k2-sw[k1]*k1)*1.0/(sw[k2]-sw[k1]); } int main(){ // freopen("a.in","r",stdin); n=read();int x=0; for(int i=1;i<=n;++i) a[i]=read(); for(int i=1;i<=n;++i) x=read(),sw[i]=sw[i-1]+x; for(int i=1;i<=n;++i) c[i]=c[i-1]+sw[i-1]; q[++h]=0; for(int i=1;i<=n;++i){ while(h<t&&slope(q[h],q[h+1])<i) ++h; f[i]=f[q[h]]+c[i]-c[q[h]]-sw[q[h]]*(i-q[h])+a[i]; while(h<t&&slope(q[t],i)<slope(q[t-1],q[t])) --t; q[++t]=i; } printf("%lld\n",f ); return 0; }
相关文章推荐
- [BZOJ3437]小P的牧场(斜率优化dp)
- BZOJ3437 小P的牧场 【斜率优化dp】
- 【bzoj3437】【小p的牧场】【斜率优化dp】
- BZOJ3437 小P的牧场 【斜率优化dp】
- 【BZOJ3437】小P的牧场 斜率优化 动态规划
- [BZOJ 3437]小P的牧场:DP斜率优化
- 【动态规划24】bzoj3437小P的牧场(dp+斜率优化)
- bzoj 3437: 小P的牧场(斜率优化DP)
- bzoj 3437: 小P的牧场【斜率优化】
- 【斜率优化】[BZOJ3437] 小P的牧场
- 【BZOJ3437】小P的牧场,斜率优化DP
- [bzoj3437][dp+斜率优化]小P的牧场
- BZOJ 3437 小P的牧场 斜率优化DP
- BZOJ3437 小P的牧场 斜率优化
- BZOJ 3437: 小P的牧场 斜率优化DP
- 【BZOJ3437】小P的牧场 斜率优化
- BZOJ 3437 小P的牧场(斜率优化DP)
- [BZOJ3437] 小P的牧场 && 斜率优化
- 【bzoj3437】小P的牧场 斜率优化dp
- 【BZOJ-3437】小P的牧场 DP + 斜率优化