字首和 (1)什麼是字首和和一維字首和

2021-10-01 10:47:13 字數 1638 閱讀 8135

字首和(prefix sum)的定義為:對於乙個給定的數列 a, 它的字首和數列 s 是通過遞推能求出來得

例如:

//假設陣列a和字首和陣列s都已經定義

int i;

//初始條件

a[0] = 0;

s[0] = 0;

for (i=1; i<=n; i++)

下面我們用乙個模板題,將完整的一維陣列字首和做乙個簡單的展示。題目鏈結

#include using namespace std;

int main() ;

for (int i=1; i<=n; i++)

for (int i=1; i<=n; i++)

cout << endl;

return 0;

}

字首和是一種重要的預處理,能大大降低查詢的時間複雜度。

字首和是以求和的方式靈活地面對區間詢問。

下面我們用乙個模板題來說明。

給你一串長度為 n 的數列 a1, a2, a3, ..., an,再給出 m 個詢問,每次詢問給出 l, r 兩個數,要求給出區間 [l, r] 裡的數的和。

詳細可以參看

題目非常簡單,我們也可以得到乙個最簡單的解法,暴力操作。也就是對應每個詢問,我們都從 l 開始到 r 結束對這個區間的資料進行求和。基本的**如下:

#include using namespace std;

const int maxn = 1e5+2;

long long arr[maxn] = {};

int main()

int m;

int l, r;

long long ans = 0;

cin >> m;

for (i=0; i> l >> r;

ans = 0;

for (j=l; j<=r; j++)

cout << ans << endl;

}return 0;

}

從上面的**非常明確的分析出來,**的時間複雜度為我們先看字首和的數學。數列a中某個下標區間 [l, r] 內的數的和定義為:

從上面推導,我們可以清晰的看出,字首和和區間和的關係。

#include using namespace std;

const int maxn = 1e5+2;

long long arr[maxn] = {};

long long sum[maxn] = {};

int main()

int m;

int l, r;

cin >> m;

for (i=0; i> l >> r;

cout << sum[r] - sum[l-1] << endl;

}return 0;

}

從上面的**非常明確的分析出來,**的時間複雜度為

字首和演算法 一維字首和 二維字首和

輸入乙個長度為n的整數序列。接下來再輸入m個詢問,每個詢問輸入一對l,r。對於每個詢問,輸出原序列中從第l個數到第r個數的和。輸入格式 第一行包含兩個整數n和m。第二行包含n個整數,表示整數數列。接下來m行,每行包含兩個整數l和r,表示乙個詢問的區間範圍。輸出格式 共m行,每行輸出乙個詢問的結果。資...

一維字首和

1 一維字首和 模板 一維字首和 模板題 acwing 795.字首和 s n a i a 2 a 3 a 4 a n s n s n 1 a n a l a l 1 a r s r s l 1 acwing795.字首和 輸入乙個長度為n的整數序列。接下來再輸入m個詢問,每個詢問輸入一對l,r。對...

1 什麼是網路字首

基礎知識 1 已知乙個ip位址,如何區分它是a類位址還是b類或者c類位址呢。a類位址 1.0.0.0 到126.0.0.0 0.0.0.0 和127.0.0.0保留 b 類位址 128.1.0.0到191.254.0.0 128.0.0.0和191.255.0.0保留 c 類位址 192.0.1.0...