文章总数40祭+P1714 切蛋糕 题解

· · 题解

P1714 切蛋糕 题解
算法分析:单调队列
最近一直在刷单调队列的题,这道题可以用来练练手
step1:把比自己大的出队列
stdp2:将当前前缀入队列
step3:将超出距离的出队列 stdp4:更新答案
std:

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <vector>
#include <cctype>
using namespace std;
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define frep(i,x,y) for(int i=x;i>=y;i--)
#define INF 2147483647
#define ll long long
const int N=500005;
int n,m; 
ll a[N];
ll s[N];
int q[N];
int h=1,t=0;
ll ans=-INF; 
int main()
{
    s[0]=0;
    scanf("%d%d",&n,&m);
    rep(i,1,n) scanf("%lld",&a[i]);
    rep(i,1,n) s[i]=s[i-1]+a[i];//计算前缀
    rep(i,1,n)
    {
        while(h<=t&&s[q[t]]>=s[i]) t--;//1出
        q[++t]=i;//2入
        while(q[h]<i-m) h++;//3出
        ans=max(ans,s[i]-s[q[h]]);//4新
    }
    printf("%d\n",ans);//愉快输出
    return 0;
}