[第1章 1.2t3] 切蛋糕

//没想到使用队列,建立一个sum累计数组,注意不要i==dq.front否则出现0污染结果
//每增加一个位置,要先检查大小,在运用窗口极小值算出最大值,同ans更新
//同时检测用当前值将dq更新成小于它的队列,保证单增,开始位置最小
#include 
using namespace std;
typedef long long ll;
int main(){
    ll n,m;
    cin>>n>>m;
    ll a;
    vector sum(n+3,0);
    for(ll i=1;i<=n;i++){
        cin>>a;
        sum[i]=sum[i-1]+a;
    }
    deque dq;
    ll ans=-1e18;
    dq.push_back(0);
    for(ll i=1;i<=n;i++){
        while(!dq.empty()&&i-dq.front()>m)dq.pop_front();
        ans=max(ans,sum[i]-sum[dq.front()]);
        while(!dq.empty()&&sum[dq.back()]>=sum[i])dq.pop_back();
        dq.push_back(i);
    }
    cout<
posted @ 2026-06-26 20:46  水暖鸭先知乎  阅读(11)  评论(0)    收藏  举报