最大区间和

题目描述

输入一个长度为 nn 的整数序列 aa,从中找出一段不超过 mm 的连续子序列(区间),使得这个序列的和最大。选出的区间可以为空。
n106,mn,109ai109n\le 10^6, m\le n, -10^9\le a_i\le 10^9

输入描述

第一行两个数 n,mn,m,第二行 nn 个整数 aia_i 表示这个数列。

输出描述

一个整数表示答案。

样例输入

6 3
1 -3 5 1 -2 3

样例输出

6
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAXN 1000005
ll n, m, ans = 0;
ll a[MAXN], sum[MAXN];
deque<ll> q;
int main() {
    cin >> n >> m;
    for (ll i = 1; i <= n; i++) {
        cin >> a[i];
        sum[i] = sum[i - 1] + a[i];
    }
    q.emplace_back(0);
    for (ll i = 1; i <= n; i++) {
        while (!q.empty() && sum[i] < sum[q.back()]) {
            q.pop_back();
        }
        q.emplace_back(i);
        while (!q.empty() && q.front() < i - m) {
            q.pop_front();
        }
        ans = max(ans, sum[i] - sum[q.front()]);
    }
    cout << ans;
    return 0;
}