切蛋糕
题目链接:https://www.luogu.com.cn/problem/P1714
题意:
在长度为n的数组中求区间窗口小于等于m的区间最大和
思路:
单调队列+前/后缀和优化
枚举区间右端点,然后对于最左端点与右端点之间进行后缀的单调队列即可
void solve(){
cin>>n>>m;
rep(i,1,n){
cin>>a[i];
}
for(int i=n;i>=1;i--){
suf[i]=suf[i+1]+a[i];
}
deque<int>q;
rep(i,1,n){
int r=i;
int l=0;
while(q.size()&&q.back()<suf[i]){
q.pop_back();
}
q.pb(suf[i]);
if(i>m&&q.front()==suf[i-m])q.pop_front();
l=q.front();
ans=max(ans,l-suf[r+1]);
}
cout<<ans<<endl;
}

浙公网安备 33010602011771号