字首和與差分

2021-10-10 16:54:23 字數 1959 閱讀 1194

字首和

* 一維字首和

** @a 表示原陣列

* @sum 表示a陣列的一維字首和

*/const

int maxn =

1e5+10;

int a[9]

=;int sum[maxn]

;void

onedimen

(int num)}s[

0]=0

;s[i]

=a[1

]+a[2]

+a[3]+

...+a[i]

;for

(int i=

1;i<=n;i++

)s[i]

=s[i-1]

+a[i]

;//字首和的初始化

[l,r]的和

s[r]

-s[l-1]

;//區間和的計算

;//求出差分陣列

void

chafen

(int num)

}//對區間進行加操作

void

addarray

(int l,

int r,

int k)

//通過差分陣列和原陣列a推理得到進行區間加後陣列中某乙個元素的值

void

get_a()

}差分就是將數列中的每一項分別與前一項數做差,例如:

乙個序列1 2 5 4 7 3,差分後得到1 1 3 -1 3 -4 -3

這裡注意得到的差分序列第乙個數和原來的第乙個數一樣(相當於第乙個數減0)

差分序列最後比原序列多乙個數(相當於0減最後乙個數)

性質:1、差分序列求字首和可得原序列

2、將原序列區間[l,r]中的元素全部+1,可以轉化操作為差分序列l處+1,r+1處-1

3、按照性質2得到,每次修改原序列乙個區間+1,那麼每次差分序列修改處增加的和減少的相同

二維字首和

/**

* 二維字首和

** @param src 原陣列

* @return 二維字首和

*/const

int maxn =

100;

int prefixsum[maxn]

[maxn]

;void

twodimen

(int a[

],int n,

int m)

else

if(i ==0)

else

if(j ==0)

else}}

}

i == 0 && j ==0,只有乙個直接賦值即可:prefixsum[0, 0] = a[0, 0]。

i == 0,最左邊的一列,二維字首和為元素上一行相同列的元素加該數字,公式為prefixsum[0, j] = prefixsum[0, j-1] + a[0, j];

j == 0,最上面一排,與i == 0類似prefixsum[i, o] = prefixsum[i-1, 0] + a[i, 0];

i!=0 || j!=0,其公式為 prefixsum[i][j] = prefixsum[i - 1][j] + prefixsum[i][j - 1] + a[i][j] - prefixsum[i - 1][j - 1];

其**模板如下所示

字首和與差分

數列的字首和 sum i 表示a 1 a i 的和 用處1 求i j的和sum j sum i 1 用處2 區間修改。設定乙個change陣列。當區間 i,j 上要加k時,我們令change i k,令change j 1 k。如果我們對change陣列求字首和的話,字首和sum change i ...

字首和與差分

從陣列第乙個開始累加 s i s i 1 a i 求區間 l,r 的和,o 1 複雜度sum s r s l 1 遞推s i j s i j s i 1 j s i j 1 s i 1 j 1 例題 雷射炸彈一種新型的雷射炸彈,可以摧毀乙個邊長為r的正方形內的所有的目標。現在地圖上有n n 1000...

字首和與差分

例題入口 include const int n 320 int a n n a i 1 a i 0 1.對a 求出平方數 將其值置為1 不是平方數就是0 2.對a求乙個字首和 3.對 a,b 求乙個部分和 int sum n n void init for int i 1 i 100000 i i...