bzoj3437

时间:2023-03-09 08:29:05
bzoj3437

练一下斜率优化

 var s1,s2,f:array[..] of int64;
q,a,b:array[..] of longint;
i,n,h,t,j:longint; function g(j,k:longint):double;
var a,b:double;
begin
a:=f[j]-f[k]-s2[j]+s2[k];
b:=s1[k]-s1[j];
exit(a/b);
end; begin
readln(n);
for i:= to n do
read(a[i]);
for i:= to n do
begin
read(b[i]);
s1[i]:=s1[i-]+b[i];
s2[i]:=s2[i-]+int64(b[i])*int64(n-i+);
end;
h:=;
t:=;
for i:= to n do
begin
while (h<t) and (g(q[h],q[h+])>=n-i+) do inc(h);
j:=q[h];
f[i]:=f[j]+a[i]+s2[i-]-s2[j]-(s1[i-]-s1[j])*int64(n-i+);
while (h<t) and (g(q[t],i)>=g(q[t-],q[t])) do dec(t);
inc(t);
q[t]:=i;
end;
writeln(f[n]);
end.