分析:
先跑前缀和,我们要的答案为
sum[i]-sum[q] (q-k<=q<=i-1)
我们想sum[q]尽可能小,建一个单调队列,把在该范围内的数存在该数组,单调递增,每把队列头拿出来求最小即可。
复杂度O(n)
代码:
var
list,sum,d:array [0..100010] of int64;
a:array [0..100001] of longint;
head,tail,n,i,j,k:longint;
x,ans:int64;
begin
readln(n,k);
for i:=1 to n do
begin
read(a[i]);
sum[i]:=sum[i-1]+a[i];
end;
head:=1; list[1]:=0; tail:=1;
for i:=1 to n do
begin
if d[head]<i-k then inc(head);
x:=sum[i]-list[head];
if x>ans then ans:=x;
if sum[i]-sum[i-1]>ans then ans:=sum[i]-sum[i-1];
inc(tail);
list[tail]:=sum[i];
d[tail]:=i;
j:=tail;
while (list[j]<list[j-1]) and (j>head) do
begin
list[j-1]:=list[j]; d[j-1]:=d[j]; dec(j); dec(tail);
end;
end;
writeln(ans);
end.