---
# System prepended metadata

title: Mảng cộng dồn
tags: [Data Structure, Prefix sum, Sum]

---

# Mảng cộng dồn 
---
**Tác giả : [Dương Nguyên Khánh](https://github.com/kduongnguyen07)**
###### tags:`Data Structure`,`Sum`,`Prefix sum`
# **Mở đầu**
Khi chúng ta cần sử dụng của các phần tử trong mảng thì 1 trong những cách hay được dùng để lưu trữ tổng là Prefix Sum hay còn được gọi là mảng cộng dồn
## Khái niệm
Cho một mảng A có n phần tử được đánh số từ 0 đến n−1, ta dựng mảng S(A) theo quy tắc sau: S[i+1] = S[i] + A[i]
<img src="https://i.imgur.com/lzBYJ89.gif">
## Cài đặt mảng cộng dồn
```C++
vector<int> buildPrefixSum(const vector<int>& a, int C = 0) {
    int n = (int)a.size();
    vector<int> prefixSum(n + 1);

    prefixSum[0] = C;

    for (int i = 0; i < n; i++)
        prefixSum[i + 1] = prefixSum[i] + a[i];

    return prefixSum;
}
```
## Ứng dụng của mảng cộng dồn
Mảng cộng dồn có một tính chất quan trọng: các phần tử được cộng lại chồng chất lên nhau một cách liên tiếp, vì thế, với mọi nửa khoảng [l,r) (0≤l<r≤n), ta chỉ cần tính Sr−Sl để tính tổng của các phần tử Al,Al+1,…,Ar−2,Ar−1. Việc trừ này cũng sẽ khử đi hằng số c của S, vì thế ta có thể dùng bất kỳ mảng S nào được sinh từ A để tính tổng.
