题目描述
输入一个长度为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 <bits/stdc++.h> #define ll long long #define met(a) memset(a,0,sizeof(a)) #define inf 0x3f3f3f3f using namespace std; const int mod=1e9+7; int a[300010],b[300010]; int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); met(a),met(b); int i,j,k,m,n; int ans=0; int l=1,r=1; cin>>n>>m; for(i=1; i<=n; i++) { cin>>k; a[i]=a[i-1]+k; } for(i=1; i<=n; i++) { while(l<=r&&b[l]<i-m) l++; ans=max(ans,a[i]-a[b[l]]); while(l<=r&&a[b[r]]>=a[i]) r--; b[++r]=i; } cout<<ans<<endl; return 0; }