​ACwing:135.最大子序列和​

题意:

给长度为n的序列,从中找出连续长度不超过m的最大子序列和

题解:

我们可以用单调队列去维护可行区间内的最最小前缀和,然后枚举​​a[i]-a[q[head]]​​的最大值

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll maxn=3e5+5;
ll a[maxn],q[maxn];
ll n,m;
void solv()
{
ll head=1,tail=0,ans=-1999999999999999999;
for(int i=1; i<=n; i++)
{
if(i-q[head]>m&&head<=tail)
head++;
ans=max(ans,a[i]-a[q[head]]);
while(head<=tail&&a[q[tail]]>a[i])
{
tail--;
}
q[++tail]=i;
}
cout<<ans<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>m;
for(ll i=1; i<=n; i++)
cin>>a[i],a[i]=a[i-1]+a[i];
solv();
}