[BZOJ 1096][ZJOI2007]仓库建设:DP斜率优化
2017-04-07 19:16
393 查看
点击这里查看原题
典型的斜率优化,主要难点在于如何计算搬运物品的费用,可以维护两个值,tot[i]表示物品总数的前缀和,sum[i]表示将i之前所有物品运到i的总费用,那么将j-i之间所有物品搬运到i的总费用即为去除将1-j之间的物品搬到i的费用,sum[i]-sum[j]-tot[j]*(dis[i]-dis[j])
典型的斜率优化,主要难点在于如何计算搬运物品的费用,可以维护两个值,tot[i]表示物品总数的前缀和,sum[i]表示将i之前所有物品运到i的总费用,那么将j-i之间所有物品搬运到i的总费用即为去除将1-j之间的物品搬到i的费用,sum[i]-sum[j]-tot[j]*(dis[i]-dis[j])
/* User:Small Language:C++ Problem No.:1096 */ #include<bits/stdc++.h> #define ll long long #define inf 999999999 using namespace std; const int M=1e6+5; ll f[M],tot[M],sum[M]; int n,head,tail,q[M]; struct no{ ll x,p,c; }a[M]; double slop(int j,int k){ return (double)(f[k]-f[j]-sum[k]+sum[j]+tot[k]*a[k].x-tot[j]*a[j].x)/(double)(tot[k]-tot[j]); } ll cal(int i,int j){ return f[j]+a[i].c+sum[i]-sum[j]-tot[j]*(a[i].x-a[j].x); } int main(){ freopen("data.in","r",stdin);// scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%lld%lld%lld",&a[i].x,&a[i].p,&a[i].c); tot[i]=tot[i-1]+a[i].p; sum[i]=sum[i-1]+tot[i-1]*(a[i].x-a[i-1].x); } for(int i=1;i<=n;i++){ while(head<tail&&slop(q[head],q[head+1])<a[i].x) 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\n",f ); return 0; }
相关文章推荐
- 【bzoj1096】[ZJOI2007]仓库建设 斜率优化dp
- 【BZOJ】1096: [ZJOI2007]仓库建设(dp+斜率优化)
- BZOJ 1096: [ZJOI2007]仓库建设 | 斜率优化DP
- [BZOJ1096][ZJOI2007]仓库建设(斜率优化DP)
- [BZOJ1096][ZJOI2007]仓库建设(斜率优化dp)
- BZOJ1096: [ZJOI2007]仓库建设 斜率优化DP
- bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)
- [省选前题目整理][BZOJ 1096][ZJOI2007]仓库建设(斜率优化DP)
- bzoj1096[ZJOI2007]仓库建设 斜率优化dp
- BZOJ 1096 ZJOI 2007 仓库建设 斜率优化DP
- [斜率优化DP] BZOJ1096: [ZJOI2007]仓库建设
- BZOJ 1096 [ZJOI2007]仓库建设(斜率优化DP)
- 【ZJOI2007】【BZOJ1096】仓库建设(斜率优化DP)
- [BZOJ1096][ZJOI2007]仓库建设(斜率优化dp)
- 【bzoj1096】[ZJOI2007]仓库建设 斜率优化DP
- BZOJ1096 [ZJOI2007]仓库建设(斜率优化dp)
- BZOJ1096(ZJOI2007)仓库建设--斜率优化DP
- [BZOJ1096]ZJOI2007仓库建设|斜率优化DP
- 【bzoj1096】【ZJOI2007】【仓库建设】【斜率优化dp】
- BZOJ 1096 [ZJOI2007]仓库建设 斜率优化dp