斜率优化
/************************************************************** Problem: 1096 User: lxy8584099 Language: C++ Result: Accepted Time:2756 ms Memory:44264 kb ****************************************************************/ /* 斜率优化 suml 前i个到第i个的距离和 sump 前i个到第i个的数量和 sumv 前i个到第i个的经费和 sumw = sump*suml 只是为了方便 f 前i个 最后一个仓库在i的最优答案 sumli <= (fk-fj+sumvj-sumvk+sumwk-sumwj)/(sumpk-sumpj) 找了半天错 以为是式子推错了 结果是斜率优化写错了。。。 luogu AC bzoj WA ???? */ #include<bits/stdc++.h> #define ll long long using namespace std; const int N=1000050; int n,q[N]; ll f[N],sumv[N],suml[N],sump[N],c[N]; double Y(int i) {return (double)(f[i]+1LL*sump[i]*suml[i]-sumv[i]);} double X(int i) {return (double)(sump[i]);} double xl(int i,int j) {return (Y(j)-Y(i))/(X(j)-X(i));} int main() { scanf("%d",&n); for(int i=1,p;i<=n;i++) { scanf("%lld%lld%lld",&suml[i],&p,&c[i]); sump[i]=sump[i-1]+p; sumv[i]=sumv[i-1]+sump[i-1]*(suml[i]-suml[i-1]); } for(int i=1,l=1,r=1;i<=n;i++) { while(l<r&&xl(q[l],q[l+1])<=suml[i]) l++; f[i]=f[q[l]]+sumv[i]-sumv[q[l]]-1LL*sump[q[l]]*(suml[i]-suml[q[l]])+c[i]; while(l<r&&xl(q[r-1],q[r])>=xl(q[r-1],i)) r--; q[++r]=i; } printf("%lld\n",f[n]); return 0; }