最大子序和
Time Limit: 1 Sec Memory Limit: 256 MB
Description
输入一个长度为n的整数序列,从中找出一段不超过m的连续子序列,使得整个序列的和最大。 例如 1,-3,5,1,-2,3 当m=4时,S=5+1-2+3=7 当m=2或m=3时,S=5+1=6。
Input
第一行两个数n,m(1<=n,m<=300000) 第二行有n个数,要求在n个数找到最大子序和。
Output
一个数,即最大子序和S(S值不超过long long int)。
Sample Input
6 4
1 -3 5 1 -2 3
Sample Output
7
分析:
所以只需要枚举j,并找到每段区间中的最小值s[i]即可
int n,m; cin>>n>>m; for(int i=1;i<=n;i++)scanf("%d",&a[i]),s[i] = s[i-1] + a[i]; //s[i] = a[1] + ... + a[i]; int l = 1,r = 1; // 维护队列左右边界 q[l] = 0;//q 单调队列 存下标 ans = -0xfffffff;// ans初始化为极小值 for(int i=1;i<=n;i++) { while(l<=r && q[l]<i-m) l++; ans = max(ans,s[i] - s[q[l]]); while(l<=r && s[q[r]]>s[i]) r--; q[++r] = i; } printf("%lld",ans);