题目来源:码蹄集
B站老师思路讲解:https://www.bilibili.com/video/BV1fY4y1C7ed/?t=1315.0&vd_source=3ae2a916df1bc5c1114c2bf3e95a2118
C++代码实现:
参考链接:https://blog.51cto.com/u_15745546/5950627
#include<bits/stdc++.h>
using namespace std;
int sum[500100];
int a[500100];
struct Node{
int post,date;
}sta[500100];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];//前缀和
}
int ans=0;
int head=0;
int M=-1e9;//可能有负数,设为负值
for(int i=1;i<=n;i++){
while(head<=ans&&sta[ans].date>=sum[i]){
ans--;//出队
}
sta[++ans].date=sum[i];//入队
sta[ans].post=i;
while(head<=ans){
if(sta[head].post>=i-m&&sta[head].post<=i){
M=max(M,sum[i]-sta[head].date);
break;
}
else{
head++;
}
}
}
printf("%d\n",M);
return 0;
}
Python代码实现:
n, m = map(int, input().split())
a = [0] + list(map(int, input().split())) # 添加前导0,使得a的下标从1开始
sum_ = [0] * (n+1)
for i in range(1, n+1):
sum_[i] = sum_[i-1] + a[i] # 计算前缀和
ans = 0
head = 0
M = -1e9 # 可能有负数,设为负值
sta = [(0, 0)] * (n+1) # 初始化栈,(post, date)
for i in range(1, n+1):
while head <= ans and sta[ans][1] >= sum_[i]:
ans -= 1 # 出队
ans += 1
sta[ans] = (i, sum_[i]) # 入队
while head <= ans:
if sta[head][0] >= i-m and sta[head][0] <= i:
M = max(M, sum_[i]-sta[head][1])
break
else:
head += 1
print(M)