參考部落格:
謝謝大佬的部落格= =
對於字首和的建立
首先對0行0列置零
公式如下:
for(int i=1;i<=n;i++)二維字首和for(int j=1;j<=m;j++)
與一維字首和類似,設s[i][j]表示所有a[i'][j']的和。(1≤i'≤i,1≤j'≤j)
有一點像「矩形的面積」那樣,把一整塊區域的值都加起來。
字首和的用途
一般用來求區間和。
對於一維情況,現在我給出乙個數列a,要求你回答m次詢問,每次詢問下標j到k的和。樸素的做法顯然是對於每次詢問都執行一次相加操作,然後輸出結果。這樣做是正確的,但是當m過大時就會導致計算次數過多而有可能超時。
超時的原因一目了然,重複計算。那麼我們應該怎麼改進這個方法呢?想象一下,我們如果先提前算好了每乙個位置的字首和,然後用s[k]-s[j],結果不就是我們這次詢問的答案嗎?這樣便會使計算量大大減小。
對於二維的區間和,也是類似的。
然後是區間查詢:
int ans=b[x2][y2]-b[x2][y1-1]-b[x1-1][y2]+b[x1-1][y1-1];然後全部**:
//good luck~
#includeusing
namespace
std;
const
int maxd=10000+10
;int
a[maxd][maxd],b[maxd][maxd];
intmain()
for(int i=1;i<=n;i++)
intx1,x2,y1,y2;
cin>>x1>>y1>>x2>>y2;
int ans=b[x2][y2]-b[x2][y1-1]-b[x1-1][y2]+b[x1-1][y1-1
]; cout
<
return0;
}
字首和演算法 一維字首和 二維字首和
輸入乙個長度為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...
python字首 python字首和演算法
我試圖理解字首和概念背後的思想,看看codity here 蘑菇揀選器問題 在字首和課程中給出的例子 我的理解是,整個概念是基於乙個簡單的屬性,即為了求陣列a的兩個位置a pos left,pos right 之間的所有元素的和,使用第二個陣列p,其中所有元素都是連續求和的,其中搜尋到的和計算為 值...