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 Format
第一行两个数n,m
第二行有n个数,要求在n个数找到最大子序和
Output Format
一个数,数出他们的最大子序和
Sample Input
6 4
1 -3 5 1 -2 3
Sample Output
7
Hint
数据范围:
100%满足n,m<=300000
Limitation
各个测试点1s
题解:
求连续子序列,先求出所有的前缀和,再枚举端点,比较求出最大值即可,记得用单调栈维护即可。
代码如下:
#include<bits/stdc++.h> using namespace std; int n,m,ans; int p[523303],s[512303],q[521031]; int main() { freopen("test.in","r",stdin); freopen("test.out","w",stdout); int h=1,t=1; cin>>n>>m; for(int i=1;i<=n;i++) { cin>>p[i]; s[i]=s[i-1]+p[i]; } for(int i=1;i<=n;i++) { while(i-q[h]>m) h++; ans=max(ans,s[i]-s[q[h]]); while(h<=t&&s[q[t]]>s[i]) t--; q[++t]=i; } cout<<ans<<endl; return 0; }
❀完结撒花❀