字首和(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...