[BZOJ 3437]小P的牧场:DP斜率优化
2017-04-08 09:07
471 查看
点击这里查看原题
和BZOJ 1096类似,方程:f[i]=max{f[j]+a[i]+sum[i]-sum[j]-tot[j]*(i-j)}
和BZOJ 1096类似,方程:f[i]=max{f[j]+a[i]+sum[i]-sum[j]-tot[j]*(i-j)}
/* User:Small Language:C++ Problem No.:3437 */ #include<bits/stdc++.h> #define ll long long #define inf 999999999 using namespace std; const int M=1e6+5; int n,head,tail,q[M]; ll f[M],a[M],b[M],sum[M],tot[M]; double slop(int j,int k){ return (f[k]-sum[k]+tot[k]*k-f[j]+sum[j]-tot[j]*j)/(double)(tot[k]-tot[j]); } ll cal(int i,int j){ return f[j]+a[i]+sum[i]-sum[j]-tot[j]*(i-j); } int main(){ freopen("data.in","r",stdin);// 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]); tot[i]=tot[i-1]+b[i]; sum[i]=sum[i-1]+tot[i-1]; } for(int i=1;i<=n;i++){ while(head<tail&&slop(q[head],q[head+1])<i) head++; f[i]=cal(i,q[head]); while(head<tail&&slop(q[tail-1],q[tail])>slop(q[tail],i)) tail--; q[++tail]=i; } printf("%lld",f ); return 0; }
相关文章推荐
- 【bzoj3437】小P的牧场(斜率优化dp)
- BZOJ3437 小P的牧场 【斜率优化dp】
- 【BZOJ3437】小P的牧场,斜率优化DP
- 【bzoj3437】小P的牧场 斜率优化dp
- BZOJ 3437: 小P的牧场 斜率优化DP
- BZOJ 3437: 小P的牧场 斜率优化dp
- [bzoj3437][dp+斜率优化]小P的牧场
- BZOJ 3437 小P的牧场(斜率优化DP)
- 【动态规划24】bzoj3437小P的牧场(dp+斜率优化)
- [BZOJ3437]小P的牧场(斜率优化dp)
- 【bzoj3437】【小p的牧场】【斜率优化dp】
- BZOJ 3437 小P的牧场 斜率优化DP
- bzoj 3437: 小P的牧场(斜率优化DP)
- BZOJ3437 小P的牧场 【斜率优化dp】
- 【BZOJ-3437】小P的牧场 DP + 斜率优化
- 【bzoj3734】小P的牧场 斜率优化dp
- bzoj 3437: 小P的牧场(斜率DP)
- 【BZOJ3437】小P的牧场 斜率优化 动态规划
- bzoj 3437 斜率优化DP
- bzoj 3437: 小P的牧场 -- 斜率优化