最大子序和 单调队列
最大子序和 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]]