字首和
* 一維字首和
** @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...