JoyOI P1305 最大子序和

目录:


题目:

传送门


分析:

用前缀和,我们可以枚举最右边的点,然后取左边合法范围内最小的前缀和,这个我们可以用单调队列进行优化。


代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<deque>
#include<stack>
#define LL long long
using namespace std;
inline LL read() {
    LL d=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
    return d*f;
}   
deque<int> q;
LL x[300001];
int main()
{
    int n=read(),m=read();
    q.push_back(0);
    long long ans=0;
    for(int i=1;i<=n;i++)
    {
        int a=read();
        x[i]=x[i-1]+a;
        while(q.size()>0&&q.front()<i-m) q.pop_front();
        ans=max(ans,x[i]-x[q.front()]);
        while(q.size()>0&&x[q.back()]>=x[i]) q.pop_back();
        q.push_back(i);
    }
    printf("%lld",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_35786326/article/details/81706949
今日推荐