快速計算一個區間內數的和 [l,r]ios
定義一個數組 ,下標要從1 開始 ,邊界值 定義 s[0]=0 (若是是全局變量 的 數組 沒必要再 初始化,若不是 記得初始化s[0]=0),記錄 s[i] 爲 數組 a 中第 i個數以前全部數的和c++
```s[i] = s[i-1] + a[i];// 遞推公式 這裏面有 i-1 因此 當 l=1 的時候 (就是從第一個數開始算的話)`下標會爲 i-1 那麼i-1 就得是 0 否則數就不對 ``數組
具體計算 使用 是 s[r]-s[l-1]
由於 s[]數組記錄的是 多少個數 的和 相減 正好剩下 兩個下標相差的值 注意這裏是 l-1
若是是 l 的話那麼 剪完以後是 s[l+1] 到 s[r] 的值 中間a[l] 的spa
在兩個前綴裏面都有,就被減掉了。.net
輸入一個長度爲n的整數序列。code
接下來再輸入m個詢問,每一個詢問輸入一對l, r。blog
對於每一個詢問,輸出原序列中從第l個數到第r個數的和。ip
輸入格式ci
第一行包含兩個整數n和m。get
第二行包含n個整數,表示整數數列。
接下來m行,每行包含兩個整數l和r,表示一個詢問的區間範圍。
輸出格式
共m行,每行輸出一個詢問的結果。
數據範圍
1≤l≤r≤n1≤l≤r≤n,
1≤n,m≤1000001≤n,m≤100000,
−1000≤數列中元素的值≤1000−1000≤數列中元素的值≤1000
輸入樣例:
5 3 2 1 3 6 4 1 2 1 3 2 4
輸出樣例:
3 6 10
#include<iostream> using namespace std; const int N=1e5+10; int a[N],s[N]; // s[0]=0; int n,m; int main() { cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; //數組 a存完以後 在 存s數組 for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i]; // 遞推公式 while(m--) { int l,r; cin>>l>>r; cout<<s[r]-s[l-1]<<endl; // 輸出的時候下標 右端點 數值 減一 } return 0; }
應用:
核心
第一個應用 : 求和 的具體操做
// 利用了容斥原理 經過 分塊的思想 // 先讀入元素 for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j]; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) /* 核心*/ s[i][j]= s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j]; // 加的時候 多加的 要減去 不要忘了 a[i][j]
第二個應用: 作差 的具體操做
int x1,y1,x2,y2; cin>>x1>>y1>>x2>>y2; cout<<s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]<<endl; // 減的時候多 減了要加回來 return 0;
輸入一個n行m列的整數矩陣,再輸入q個詢問,每一個詢問包含四個整數x1, y1, x2, y2,表示一個子矩陣的左上角座標和右下角座標。
對於每一個詢問輸出子矩陣中全部數的和。
輸入格式
第一行包含三個整數n,m,q。
接下來n行,每行包含m個整數,表示整數矩陣。
接下來q行,每行包含四個整數x1, y1, x2, y2,表示一組詢問。
輸出格式
共q行,每行輸出一個詢問的結果。
數據範圍
1≤n,m≤10001≤n,m≤1000,
1≤q≤2000001≤q≤200000,
1≤x1≤x2≤n1≤x1≤x2≤n,
1≤y1≤y2≤m1≤y1≤y2≤m,
−1000≤矩陣內元素的值≤1000−1000≤矩陣內元素的值≤1000
輸入樣例:
3 4 3 1 7 2 4 3 6 2 8 2 1 2 3 1 1 2 2 2 1 3 4 1 3 3 4
輸出樣例:
17 27 21
#include<iostream> using namespace std; const int N=1e3+10; int a[N][N],s[N][N]; int n,m,q; int main() { cin>>n>>m>>q; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { cin>>a[i][j]; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j]; while(q--) { int x1,y1,x2,y2; cin>>x1>>y1>>x2>>y2; cout<<s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]<<endl; } return 0; }