2019E1_B 前綴和

B 前綴和

題目

知識點

前綴和是一種較爲常見的預處理方式,能大大降低查詢的時間複雜度。我們可以簡單理解爲“數列的前 n 項的和”。

對於一個給定的序列A,其前綴和S的定義如下:

S[i]=j=1iA[j]S[i]=\sum_{j=1}^{i}A[j]

預處理出來前綴和序列S後我們就可以 O(1)O(1)的查詢區間和

sum(l,r)=S[r]S[l1]sum(l,r)=S[r]−S[l−1]

練習題

給定一個長度爲n的整數序列A,問連續k個整數的和的最大值。

輸入

第一行兩個正整數 n,k,(0<n<106,0<k<n)n,k,(0<n<10^{6},0<k<n)

第二行 nn 個整數,表示序列 A(106<Ai<106)A,(−10^{6}<A_{i}<10^{6})

輸出

一行一個整數

輸入樣例

5 3 
2 5 -4 10 3

輸出樣例

11

思路

預處理一下前綴和,然後遍歷一遍求最大值

代碼

#include <algorithm>
#include <iostream>

using namespace std;
typedef long long ll;
const int ms = 1e6 + 10;
ll sum[ms];

inline void init_cin()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
}

int main()
{
    init_cin();
    int n, k;
    cin >> n >> k;
    for (int i = 1; i <= n; ++i)
    {
        cin >> sum[i];
        sum[i] += sum[i - 1];
    }
    ll res = sum[k];
    for (int i = 2; i + k - 1 <= n; ++i)
    {
        res = max(res, sum[i + k - 1] - sum[i - 1]);
    }
    cout << res << "\n";
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章