[BZOJ1010][HNOI2008]玩具装箱toy

31 篇文章 0 订阅
8 篇文章 0 订阅

原题地址

第一题斜率优化DP,代码较搓OLZ…

AC code:

#include <cstdio>
typedef long long ll;
const int N=100010;
ll n,l;
ll c[N],s[N],f[N];

struct Vec{
    ll x,y;

    Vec() {}
    Vec(ll x,ll y):x(x),y(y) {}
    friend Vec operator-(Vec A,Vec B){
        return Vec(A.x-B.x,A.y-B.y);
    }
    friend ll operator*(Vec A,Vec B){
        return A.x*B.y-A.y*B.x;
    }
};

struct Graham{
    ll  he,ta;
    Vec q[N];

    void push(Vec A){
        while(ta-he&&(q[ta]-q[ta-1])*(A-q[ta])>=0) ta--;
        q[++ta]=A;
    }
}Q;

void read(){
    scanf("%lld%lld",&n,&l);
    for(ll i=1;i<=n;i++){
        scanf("%lld",&c[i]);
        s[i]=s[i-1]+c[i];
    }
}

void work(){
    Q.he=Q.ta=1;Q.q[1]=Vec(0,0);
    ll pt=1;
    for(ll i=1;i<=n;i++){
        ll  k=i+s[i]-l-1;
        Vec v1,v2,u;
        while(1){
            if(pt==Q.ta) break;
            v1=Q.q[pt];v2=Q.q[pt+1];
            if(v1.y+2*k*v1.x<v2.y+2*k*v2.x) break;
            pt++;
        }
        u=Q.q[pt];
        f[i]=u.y+2*k*u.x+k*k;
        Q.push(Vec(-i-s[i],f[i]+(i+s[i])*(i+s[i])));
    }
    printf("%lld\n",f[n]);
}

int main(){
    read();
    work();

    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值