传送门
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.