!-- Loading 底层遮罩 -->

P1714 切蛋糕

感谢所有AC

传送门

思路

    最大不定子段和(dp思想),前缀和+单调队列优化。

代码

#include<iostream>
#include<algorithm>
#define MAXN 500007
using namespace std;
int n, m, arr[MAXN], q[MAXN], ans = INT32_MIN;
int main(void)
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        cin >> arr[i];
        arr[i] += arr[i - 1];
    }
    int head = 0, tail = 0;
    for (int i = 1; i <= n; i++)
    {
        while (head < tail && q[head] + m < i)
            head++;
        while (head < tail && arr[i] < arr[q[tail - 1]])
            tail--;
        q[tail++] = i;
        ans = max(ans, arr[q[tail - 1]] - arr[q[head]]);
    }
    cout << max(ans,arr[1]);
    return 0;
}
 

 

posted @ 2022-03-30 21:48  Thinker-X  阅读(25)  评论(0)    收藏  举报