题解
2025-05-24 15:31:01
发布于:上海
22阅读
0回复
0点赞
朴实无华的单调队列,由于两端都需要删除,所以记得用
我们只需要找作为结果即可,因此可以枚举找对于当前的最大,又因为是找最大,则找对于最小的,故用单调递增队列
#include<iostream>
#include<deque>
using namespace std;
const int N=5e5+10;
deque<int>dq;
int n,m,a[N],psy[N],ans;//psy前缀和
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
psy[i]=psy[i-1]+a[i];
}
dq.push_back(0);
for(int R=1;R<=n;R++){
while(dq.size()&&psy[dq.back()]>psy[R])dq.pop_back();//维护单调递增
while(dq.size()&&R-dq.front()>m)dq.pop_front();//维护差值不超过m
ans=max(ans,psy[R]-psy[dq.front()]);
dq.push_back(R);
}
cout<<ans;
return 0;
}
这里空空如也
有帮助,赞一个