输入一个长度为n的整数序列,从中找出一段不超过m的连续子序列,使得整个序列的和最大。
#include <bits/stdc++.h>
using namespace std;
int n,m;//
int qu[300001],sum[300001];
int main(){
cin>>n>>m;
sum[0]=0;
for(int i=1;i<=n;i++){
int a;
scanf("%d",&a);
sum[i]=sum[i-1]+a;
}
int ans=INT_MIN;
int l=1,r=1;
qu[1]=0;//选择j=0
for(int i=1;i<=n;i++){
while(l<=r&&i-qu[l]>m) l++;
ans=max(ans,sum[i]-sum[qu[l]]);
while(l<=r&&sum[qu[r]]>=sum[i])r--;
qu[++r]=i;
}
cout<<ans<<endl;
return 0;
}