现在的位置: 首页 > 综合 > 正文

1096: [ZJOI2007]仓库建设

2018年01月13日 ⁄ 综合 ⁄ 共 723字 ⁄ 字号 评论关闭
#include<iostream>
#include<cstdio>
using namespace std;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int n,l,r;
long long x[1000001],p[1000001],c[1000001],h[1000001],q[1000001],f[1000001];
inline long long calc(int k,int j){
    return (long long)((double)(f[j]-f[k]+h[j]-h[k])/(double)(p[j]-p[k]));
}
int main(){
    n=read();
    for(int i=1;i<=n;i++){
        x[i]=read();p[i]=read();c[i]=read();
    }
    for(int i=1;i<=n;i++){
        h[i]=h[i-1]+x[i]*p[i];p[i]+=p[i-1];
    }
    for(int i=1;i<=n;i++){
        while(l<r&&calc(q[l],q[l+1])<x[i])l++;
        int t=q[l];f[i]=f[t]+x[i]*(p[i]-p[t])-h[i]+h[t]+c[i];
        while(l<r&&calc(q[r],i)<calc(q[r-1],q[r]))r--;
        q[++r]=i;
    }
    printf("%lld",f[n]);
    return 0;
}    

抱歉!评论已关闭.