字首和問題

2021-07-09 11:51:38 字數 500 閱讀 7067

這個優化主要是用來在o(1)時間內求出乙個序列a中,a[i]+a[i+1]+……+a[j]的和。

具體原理十分簡單:用sum[i]表示(a[1]+a[2]+……+a[i]),其中sum[0]=0,則(a[i]+a[i+1]+……+a[j])即等於sum[j]-sum[i-1]

同理,有一維就有二維。對於乙個矩陣a,我們也能在o(1)時間內求出子矩陣[x1~x2][y1~y2]的和。

設sum[i][j]為子矩陣[1~i][1~j]的和。則由容斥原理得:

sum[0][j]=sum[i][0]=0

a[x1~x2][y1~y2]=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1]

核心就兩個字:降維

面對許多高維問題,往往字首和是最先想到的降維方法。

這樣在降維的基礎上,許多更進一步的優化才能實現。

字首和問題

題大意 給你n個數和乙個k,問有多少個區間可以得到sum k 0,比如 l,r a l a l 1 a r k 0 解法 利用字首和儲存得到字首和陣列,並用乙個陣列記錄下此時字首和出現的次數,因為當重複出現同乙個字首和的時候代表有一段區間能夠 k 0。include include include ...

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

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

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

字首和 prefix sum 的定義為 對於乙個給定的數列 a,它的字首和數列 s 是通過遞推能求出來得 例如 假設陣列a和字首和陣列s都已經定義 int i 初始條件 a 0 0 s 0 0 for i 1 i n i 下面我們用乙個模板題,將完整的一維陣列字首和做乙個簡單的展示。題目鏈結 inc...