---
# System prepended metadata

title: prefix 前綴和
tags: [程設班講義]

---

# 簡介

為了快速計算數列的任意區間總和，可以用此技巧將每次查詢的時間複雜度從 $O(n)$ 降到 $O(1)$。

首先建立兩個陣列：
$a[1 \dots n]$ ： 原始數列
$pre[1 \dots n]$ ： 前綴和陣列

其中前綴和定義為：
$pre[i] = a[1] + a[2] + \cdots + a[i]$

對於任意區間 $[l, r]$，其區間總和為：
$\sum_{i=l}^{r} a[i] = pre[r] - pre[l - 1]$

這樣查詢只需要一次減法，效率高於使用 for 迴圈逐項加總。

![image](https://hackmd.io/_uploads/rySo0T2Y1l.png)

# 程式碼

```cpp=
#include<bits/stdc++.h>
using namespace std ;
int a[11] ;
int pre[11] ;
int main(){
    for(int i = 1; i <= 10; i++){
        cin >> a[i - 1];
        pre[i] = pre[i - 1] + a[i - 1] ;  // 計算。
    }
    while(1) {
        int ql , qr ;
        cin >> ql >> qr ;
        cout << pre[qr] - pre[ql-1] << endl ;  // 查詢。
    }
}
```

# 例題
[a681. B. 吳乙己](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a681)

[a800: 千束開車(1)](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a800)

###### 都看到這了難道不按個愛心支持一下嗎?