输入长度为n的整数序列,从中找到长度小于或等于m的连续子序列,使子序列中所有数的和最大化。
输入格式
在第一行中输入两个整数n,m。
在第二行中,输入表示长度为n的整数序列的n的个数。
用空格分隔相同的行数。
输出格式
输出表示序列最大子序和的整数。
数据范围
1n,m300001n,m300000
输入示例:
6 4
1 -3 5 1 -2 3
输出示例:
7
# include iostream # includedequeusingnamespacestd; dequeint q; int arr[300010]; int sum[300010] int main () { int n,m; scanf_s('%d%d ',n,m ); 短信(arr,0,sizeof ) arr ); memset(ARR,0,sizeof ) sum ); for(intI=1; i=n; I ) Scanf_s('%d ',arr[i]; sum[i]=sum[i - 1] arr[i]; } int res=-INT_MIN; int l,r; //左区间和右区间for(intI=1; i=n; I () { while (! q.empty(I-q.front ) (m ) ) /? 为什么大于: sum[i]-sum[k]的长度M=4 q.pop_front(//如果队列中的数量超过m,请单击(} int k )上一个弹出窗口; if (! q.empty () ) k=q.front ); else k=0; if(RESsum[i] - sum[k] ) RES=max ) RES,sum[I]-sum[k] ); l=k 1; r=i; } while (! q.empty (sum [ q.back ]=sum [ I ] ) /利用前缀和保持单调队列,根据前缀和的性质q.pop_back ); ) q.push_back(I; //q中的sum[]保持单调} cout res' 'l' 'rendl; 返回0; }