输入一个长度为 n 的整数序列,从中找出一段长度不超过 m 的连续子序列,使得子序列中所有数的和最大。
注意: 子序列的长度至少是 1。
输入格式
第一行输入两个整数 n,m。
第二行输入 n 个数,代表长度为 n 的整数序列。
同一行数之间用空格隔开。
输出格式
输出一个整数,代表该序列的最大子序和。
数据范围
1≤n,m≤300000
输入样例:
6 4
1 -3 5 1 -2 3
输出样例:
7
思路:单调队列:
一般区间和用前缀和做,这道题前缀和枚举每个区间的话时间复杂度最高位O(n^2),会超时;
单调队列优化只需要O(n);
我们先求出前缀和,则区间和可以转化为前缀和相减的方式;
对于右端点i,我们要找出前缀和s[j]最小(i-m<=j<=i-1),使得s[i]-s[j]最大;
我们可以比较一下两个位置j,k,如果k<j<i并且s[k]>=s[j];
对于所有>=i的端点,都不会选择k作为右端点,因为s[k]>=s[j]并且j距离i更近,选择j明显更好;
所以我们可以得出所有的满足条