AcWing 135. 最大子序和
原题链接
简单
作者:
cordis
,
2020-08-07 16:32:36
,
所有人可见
,
阅读 446
注意点
1.注意前缀和的边界问题,从1开始轻松s[i]+=s[i-1];
2.单调队列的运用 if(i-m>a[hh]) hh++,while(hh<=tt&&s[i]<=s[a[tt]) tt--;
C++ 代码
#include <iostream>
#include <limits.h>
using namespace std;
typedef long long ll;
const int N=3e5+10;
ll s[N],a[N];
int main ()
{
int m,n;
cin.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>s[i], s[i]+=s[i-1];
ll res=INT_MIN;
int hh=0,tt=0;
for(int i=1;i<=n;i++)
{
while(i-m>a[hh]) hh++;
while(hh<=tt&&s[i]<=s[a[tt]]) tt--;
res=max(res,s[i]-s[a[hh]]);
a[++tt]=i;
}
cout<<res<<endl;
return 0;
}