[BZOJ3437] 小P的牧场

来源:互联网 发布:本.西蒙斯体测数据 编辑:程序博客网 时间:2024/04/30 04:13

传送门

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 0