题目描述
输入一个长度为n的整数序列,从中找出一段不超过m的连续子序列,使得整个序列的和最大。
例如 1,-3,5,1,-2,3
当m=4时,S=5+1-2+3=7
当m=2或m=3时,S=5+1=6
例如 1,-3,5,1,-2,3
当m=4时,S=5+1-2+3=7
当m=2或m=3时,S=5+1=6
输入
第一行两个数n,m(n,m<=300000)
第二行有n个数,要求在n个数找到最大子序和
第二行有n个数,要求在n个数找到最大子序和
输出
一个数,数出他们的最大子序和
样例输入
6 4
1 -3 5 1 -2 3
样例输出
7

#include <iostream> #include <string> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include <deque> #include <map> #define range(i,a,b) for(int i=a;i<=b;++i) #define LL long long #define rerange(i,a,b) for(int i=a;i>=b;--i) #define fill(arr,tmp) memset(arr,tmp,sizeof(arr)) using namespace std; int n,m,ans,ss[300005],qq[300005]; void init() { cin>>n>>m; range(i,1,n){ cin>>ss[i]; ss[i]+=ss[i-1]; } } void solve(){ int front=1,tail=1; range(i,1,n){ if(i-qq[front]>m)front++; ans=max(ans,ss[i]-ss[qq[front]]); while(front<=tail&&ss[qq[tail]]>=ss[i])tail--; tail++; qq[tail]=i; } cout<<ans<<endl; } int main() { init(); solve(); return 0; }