题目
思路
转化为sum[i]-sum[j]的问题,固定i,去求解j[i-m,i-1]的最小值
代码
#include<bits/stdc++.h>
using namespace std;
vector<int> a,sum;
// 第一个表示val,第二个表示pos
deque<pair<int,int>> dq;
int main(){
cin.tie(0);
ios::sync_with_stdio(0);
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
int x;
cin>>x;
a.push_back(x);
}
sum.push_back(a[0]);
for(int i=1;i<n;i++)
sum.push_back(sum[i-1]+a[i]);
int ans=sum[0];
dq.push_back({sum[0],0});
for(int i=1;i<m;i++){
while(dq.size()>0&&dq.back().first>=sum[i])
dq.pop_back();
int val=0;
if(dq.size())val=min(0,dq.front().first);
ans=max(ans,sum[i]-val);
dq.push_back({sum[i],i});
}
for(int i=m;i<n;i++){
while(dq.size()>0&&dq.back().first>=sum[i])
dq.pop_back();
while(dq.size()>0&&dq.front().second<i-m)
dq.pop_front();
int val=0;
if(dq.size())val=dq.front().first;
ans=max(ans,sum[i]-val);
dq.push_back({sum[i],i});
}
cout<<ans<<'\n';
return 0;
}