传送门
题意
输入一个长度为n的整数序列,从中找出一段不超过m的连续子序列,使得整个序列的和最大。
思路
先用存一下序列的前缀和
我们需要找到一个最大的
拿双端队列维护
最优解的情况就是下标递增,也递增才可以
代码
int a[maxn],sum[maxn];
deque<int>q;
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
sum[i]=sum[i-1]+a[i];
}
q.push_back(0);
int ans=-inf;
for(int i=1;i<=n;i++){
while(q.size()&&q.front()<i-m){
q.pop_front();
}
if(q.size()){
ans=max(ans,sum[i]-sum[q.front()]);
}
while(q.size()&&sum[q.back()]>=sum[i]){
q.pop_back();
}
q.push_back(i);
}
cout<<ans<<endl;
}