Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
34579 | . | 仓库建设 | C++ | 通过 | 100 | 144 MS | 39692 KB | 921 | 2021-12-12 08:28:02 |
#include <bits/stdc++.h> #define gc getchar() #define ll long long using namespace std; const int N=1e6+10; inline void qr(ll &x) { x=0;int f=1;char c=gc; while(c<'0'||c>'9'){if(c=='-')f=-1;c=gc;} while(c>='0'&&c<='9'){x=x*10+(c^48);c=gc;} x*=f; } void qw(ll x) { if(x<0)x=-x,putchar('-'); if(x/10)qw(x/10); putchar(x%10+48); } ll s[N],p[N],c[N],f[N],dis[N]; inline double calc(int j,int k) { return (f[j]-f[k]+s[j]-s[k])/(double)(p[j]-p[k]); } int q[N],l,r,n; int main() { scanf("%d",&n); for(int i=1;i<=n;i++)qr(dis[i]),qr(p[i]),qr(c[i]); for(int i=1;i<=n;i++) { s[i]=s[i-1]+dis[i]*p[i]; p[i]+=p[i-1]; } l=1;r=1;q[1]=0; for(int i=1;i<=n;i++) { while(l<r&&calc(q[l],q[l+1])<=1.0*dis[i])++l; f[i]=f[q[l]]+(p[i-1]-p[q[l]])*dis[i]-(s[i-1]-s[q[l]])+c[i]; while(l<r&&calc(q[r],i)<=calc(q[r-1],q[r]))--r; q[++r]=i; } qw(f[n]);puts(""); return 0; }