bzoj 1096: [ZJOI2007]仓库建设【斜率优化】
2018-09-15 09:59
381 查看
好眼熟啊
直接dp显然很难算,所以设val为只在n点建一个仓库的费用,然后设f[i]为在i~n点建若干仓库并且i点一定建一个仓库的最大省钱数
转移很显然,设s为p的前缀和,f[i]=max{f[j]+s[i]*(x[j]-x[i])}-a[i]
然后推转移
\[
f[i]=f[j]+s[i]*x[j]-s[i]*x[i]-a[i]
\]
\[
-s[i]*x[j]+f[i]=f[j]-s[i]*x[i]-a[i]
\]
k=-s[i],x=x[j],b=f[j],y=f[j]-s[i]*x[i]-a[i],斜率优化转移即可
#include<iostream> #include<cstdio> using namespace std; const int N=1000005; int n,q ,l,r; long long x ,p ,s ,a ,f ,val,mx; int read() { int r=0,f=1; char p=getchar(); while(p>'9'||p<'0') { if(p=='-') f=-1; p=getchar(); } while(p>='0'&&p<='9') { r=r*10+p-48; p=getchar(); } return r*f; } double wk(int j,int k) { return (double)(f[k]-f[j])/(double)(x[k]-x[j]); } int main() { n=read(); for(int i=1;i<=n;i++) x[i]=read(),p[i]=read(),s[i]=s[i-1]+p[i],a[i]=read(); for(int i=1;i<=n;i++) val+=p[i]*(x -x[i]); val+=a ;//cerr<<val<<endl; l=r=1,q[1]=n; for(int i=n-1;i>=1;i--) { while(l<r&&wk(q[l],q[l+1])<-s[i]) l++; f[i]=f[q[l]]+s[i]*(x[q[l]]-x[i])-a[i];//cerr<<i<<" "<<f[i]<<endl; mx=max(mx,f[i]); while(l<r&&wk(q[r-1],q[r])>wk(q[r],i)) r--; q[++r]=i; } printf("%lld\n",val-mx); return 0; }
相关文章推荐
- BZOJ 1096: [ZJOI2007]仓库建设 [斜率优化DP]
- BZOJ_1096_[ZJOI2007]_仓库建设_(斜率优化动态规划+单调队列+特殊的前缀和技巧)
- 【bzoj1096】[ZJOI2007]仓库建设 斜率优化dp
- bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)
- BZOJ 1096: [ZJOI2007]仓库建设 斜率优化
- BZOJ 1096: [ZJOI2007]仓库建设【斜率优化】
- BZOJ 1096 [ZJOI2007]仓库建设(斜率优化DP)
- [BZOJ1096][ZJOI2007]仓库建设(斜率优化DP)
- BZOJ 1096 ZJOI2007 仓库建设 斜率优化
- BZOJ 1096 [ZJOI2007]仓库建设 斜率优化dp
- 【斜率优化】BZOJ1096-[ZJOI2007]仓库建设
- bzoj1096[ZJOI2007]仓库建设——DP+斜率优化
- BZOJ1096: [ZJOI2007]仓库建设 斜率优化DP
- BZOJ 1096: [ZJOI2007]仓库建设(动态规划+斜率优化)
- 斜率优化专题5——bzoj 1096 [ZJOI2007]仓库建设 题解
- bzoj1096[ZJOI2007]仓库建设 斜率优化dp
- BZOJ1096(ZJOI2007)仓库建设--斜率优化DP
- bzoj1096 [ZJOI2007]仓库建设(斜率优化)
- [BZOJ1096][ZJOI2007][DP][斜率优化]仓库建设
- BZOJ 1096 [ZJOI2007]仓库建设 斜率优化dp