————出自南昌理工學院acm集訓隊
二維字首和
字首和是什麼呢?字首就是乙個陣列的某項下標之前(包括此項元素)的所有陣列元素的和。
簡單點來說就是有n個數,求n個數包括第n個數的所有數的和。
s[n]=a[1]+a[2]+a[3]+a[4]+…+a[n].
字首和最基本的用法就是解決求某個區間所有數的和,經過字首和的預處理,可以大大降低查詢的時間複雜度。
//字首和的預處理
for(
int i=
0;i<=n;i++
)int l,r;
//區間的範圍
cin>>l>>r;
cout<
-b[l-1]
;//求l到r的所有的數的和,因為是求[l,r],包括了l,所以只需減掉l-1的所有的數之和即可。
簡單的原題
題目
輸入乙個長度為n的整數序列。
接下來再輸入m個詢問,每個詢問輸入一對l, r。
對於每個詢問,輸出原序列中從第l個數到第r個數的和。
輸入格式
第一行包含兩個整數n和m。
第二行包含n個整數,表示整數數列。
接下來m行,每行包含兩個整數l和r,表示乙個詢問的區間範圍。
輸出格式
共m行,每行輸出乙個詢問的結果。
資料範圍
1≤l≤r≤n ,
1≤n,m≤100000,
−1000≤數列中元素的值≤1000
輸入樣例:
5 3輸出樣例2 1 3 6 4
1 21 3
2 4
3610思路就是求n到m區間的所有數的和,直接用字首和求解即可。
**:
#include
using
namespace std;
typedef
long
long ll;
const
int n =
1e5+5;
intmain()
a[0]
=0;for
(int i =
1; i <= n; i++
)while
(m--
)return0;
}
了解了一維字首和,就來兩個例題練練手吧:最短距離,數圈圈。
二維字首和其實和一維的思想差不多.
基本公式是:a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1]+a[i][j] ,
方便理解我們直接上圖來解釋
以下是陣列a[6][5]所存的數:
例如我們要求a[3][4]字首和,本身肯定要相加,我們還得再加上a[2][4]的字首和,再加上a[3][3]的字首和,然後我們會發現a[2][3]的這個部分加了兩遍,所以我們還要減去一次a[2][3]的值,所以我們得出a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1]+a[i][j] 這個公式。
//字首和的預處理
for(
int i=
1;i<=n;i++
)}
(原題)
題目
輸入乙個n行m列的整數矩陣,再輸入q個詢問,每個詢問包含四個整數x1, y1, x2, y2,表示乙個子矩陣的左上角座標和右下角座標。
對於每個詢問輸出子矩陣中所有數的和。
輸入格式
第一行包含三個整數n,m,q。
接下來n行,每行包含m個整數,表示整數矩陣。
接下來q行,每行包含四個整數x1, y1, x2, y2,表示一組詢問。
輸出格式
共q行,每行輸出乙個詢問的結果。
資料範圍
1≤n,m≤1000,
1≤q≤200000,
1≤x1≤x2≤n,
1≤y1≤y2≤m,
−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思路2721
就是給定乙個區間,求這個區間二維矩陣的所有數之和,象徵性的來說就是求紅色區域的面積,直接用總面積減去黃色和綠色的面積,再加上重複減的面積,也就是字首和。
**
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const
int n=
1010
;int a[n]
[n],s[n]
[n];
int n,m,q;
intmain()
}for
(int i=
1;i<=n;i++)}
for(
int i=
0;i)return0;
}
emm,沒 字首和(一維 二維)
1.一維字首和 字首和 s i a 1 a 2 a i 區間和 l,r a l a r s r s l 1 題目795 輸入乙個長度為n的整數序列。接下來再輸入m個詢問,每個詢問輸入一對l,r。對於每個詢問,輸出原序列中從第l個數到第r個數的和。輸入格式 第一行包含兩個整數n和m。第二行包含n個整數...
一維 二維字首和
基礎知識 一維字首和 s i a 1 a 2 a i a l a r s r s l 1 二維字首和 s i,j 第 i 行 j 列格仔左上部分所有元素的和 以 x1,y1 為左上角,x2,y2 為右下角的子矩陣的和為 s x2,y2 s x1 1,y2 s x2,y1 1 s x1 1,y1 1 ...
一維字首和與二維字首和
什麼是字首和?字首和是乙個陣列的某項下標之前 包括此項元素 的所有陣列元素的和。作用 快速求出某一段區間的總和 such as 求出a 3 a 4 a 15 sum 15 sum 2 sum為字首和 優勢 可以在o 1 的複雜度求出某一部分的總和 設b為字首和陣列,a為原陣列,根據這句話可以得到字首...