码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj1096: [ZJOI2007]仓库建设

时间:2017-11-07 18:12:08      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:lld   int   ace   class   zjoi   name   names   logs   font   

复习斜率优化。

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
int list[1010000];
LL f[1010000],d[1010000],sp[1010000];
LL s[1010000],p[1010000],c[1010000];
double X(int j)
{
    return double(f[j]+d[j]);
}
double Y(int j)
{
    return double(sp[j]);
}
double slope(int j1,int j2)
{
    return (X(j1)-X(j2))/(Y(j1)-Y(j2));
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%lld%lld%lld",&s[i],&p[i],&c[i]);
    d[0]=0;sp[0]=0;
    for(int i=1;i<=n;i++)
    {
        sp[i]=sp[i-1]+p[i];
        d[i]=d[i-1]+p[i]*s[i];
    }
    int head=1,tail=1;
    list[1]=0;
    for(int i=1;i<=n;i++)
    {
        while(head<tail&&slope(list[head],list[head+1])<double(s[i]))head++;
        int j=list[head];
        f[i]=f[j]+c[i]+(sp[i-1]-sp[j])*s[i]-(d[i-1]-d[j]);
        while(head<tail&&slope(list[tail-1],list[tail])>slope(list[tail],i))tail--;
        list[++tail]=i;
    }
    printf("%lld\n",f[n]);
    return 0;
}

 

bzoj1096: [ZJOI2007]仓库建设

标签:lld   int   ace   class   zjoi   name   names   logs   font   

原文地址:http://www.cnblogs.com/AKCqhzdy/p/7799553.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!