输入一个长度为n的整数序列,从中找出一段长度不超过m的连续子序列,使得子序列中所有数的和最大。
输入格式
第一行输入两个整数n,m。
第二行输入n个数,代表长度为n的整数序列。
同一行数之间用空格隔开。
输出格式
输出一个整数,代表该序列的最大子序和。
数据范围
1≤n,m≤300000
输入样例:
1 | 6 4 |
输出样例:
7
思想:
tips: 求m连续区间内大于某数可以用尺取法。
1.这道题利用前缀和将区间加和转化为两点相减问题就转化为了在m之内,
求最大纵坐标差。
2.利用队列来维护单调性 - 单调队列
- 先预处理出前缀和,队列里首先入0来处理出边界sum[r] - sum[l - 1],当一个元素入队时,
如果sum[i] - q[l] > m,一直出队队首直到相距距离 <= m - 更新答案,由于是单调的,则sum[i] - sum[q[l]]是当前最小。
- 若sum[i] >= sum[q[r]],则将队尾出队,由于q[0] = 0, 最后会在此停下
- 新元素入队
1 | #include <iostream> |