BZOJ-1010 玩具装箱
DP+斜率优化
DP方程为dp[i]:=max(dp[j]+sum[i]-sum[j]+i-j-1)(j<i)
然后斜率优化。。。。
-
var
-
n,i,l,s,t,a,b,c:longint;
-
num,dp,xl,sum:array[0..50005] of int64;
-
-
begin
-
read(n,l);
-
for i:=1 to n do read(num[i]);
-
for i:=1 to n do sum[i]:=sum[i-1]+num[i];
-
for i:=1 to n do sum[i]:=sum[i]+i;
-
s:=1;t:=1;
-
for i:=1 to n do
-
begin
-
while s<t do
-
begin
-
a:=xl[s];
-
b:=xl[s+1];
-
if 2*(sum[i]-1-l) > ((dp[b]-dp[a]+sum[b]*sum[b]-sum[a]*sum[a])/(sum[b]-sum[a])) then
-
begin
-
xl[s]:=0;inc(s);
-
end
-
else break;
-
end;
-
a:=xl[s];
-
dp[i]:=dp[a]+(sum[i]-sum[a]-l-1)*(sum[i]-sum[a]-l-1);
-
inc(t);
-
xl[t]:=i;
-
while t-s>1 do
-
begin
-
a:=xl[t-2];b:=xl[t-1];c:=xl[t];
-
if (dp[b]-dp[a]+sum[b]*sum[b]-sum[a]*sum[a])/(sum[b]-sum[a]) >
-
(dp[c]-dp[b]+sum[c]*sum[c]-sum[b]*sum[b])/(sum[c]-sum[b]) then
-
begin
-
xl[t-1]:=xl[t];xl[t]:=0;dec(t);
-
end
-
else break;
-
end;
-
end;
-
write(dp[n]);
-
end.