淺醉和的基礎講解

开始优化發表於2024-03-10

什麼是字首和

O(N)的預處理 以O(1)的時間求部分和

S[1, N] = a1 + a2 + ... + aN;
我們如果要求S[L, R]
a1 + a2 + ... + aL-1 + aL + ... + aR
就是要aL + ... + aR的部分 -》 S[R] - S[L - 1]

S[]怎麼來 S[i] = S[i - 1] + a[i]

  

字首和的逆

它是字首和的轉變 a[i] = pre[i] - pre[i - 1]

Code:

#include <bits/stdc++.h>
    
using namespace std; 
const int N = 105;

int pre[N];

int main() { 
    int N; cin >> N;
    for (int i = 1; i <= N; i++) {
        cin >> pre[i];
    }
    for (int i = 1; i <= N; i++) {
        cout << pre[i] - pre[i - 1] << " \n"[i == N];
    }
    return 0;
}

  

Index * A

求出連續長度為M的子陣列B的 i * Bi + M * Bm的最大值

Code:

相關文章