[BZOJ3437] 小P的牧场

传送门

http://www.lydsy.com/JudgeOnline/problem.php?id=3437

题目大意

。。。

题解

斜率优化

uses math;
const
    maxn=1000000;
var
    sum1,sum2,s,x,f:array[0..maxn]of int64;
    t:array[0..maxn]of longint;
    i,j,k:longint;
    n,m,a,head,tail:longint;
    tt:int64;
function check1(a,b,c:longint):boolean;
begin
    exit((s[a]-s[b])>int64(c)*(sum1[a]-sum1[b]));
end;

function check2(a,b,c:longint):boolean;
begin
    exit(((s[a]-s[b])*(sum1[b]-sum1[c]))>((s[b]-s[c])*(sum1[a]-sum1[b])));
end;

begin
    readln(n); sum1[0]:=0; sum2[0]:=0;
    for i:=1 to n do
        read(x[i]);
    for i:=1 to n do
        begin
            read(a);
            sum1[i]:=sum1[i-1]+a;
            sum2[i]:=sum2[i-1]+int64(a)*i;
        end;
    head:=0; tail:=0; f[0]:=0;
    for i:=1 to n do
        begin
            while (head<tail)and(check1(t[head],t[head+1],i)) do inc(head);
            f[i]:=f[t[head]]+x[i]+(sum1[i-1]-sum1[t[head]])*i-(sum2[i-1]-sum2[t[head]]);
            s[i]:=f[i]+sum2[i];
            while (head<tail)and(check2(t[tail-1],t[tail],i)) do dec(tail);
            inc(tail); t[tail]:=i;
        end;
    writeln(f[n]);
end.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值