題目:
來先看一道裸題,有n個數。
m個操作,每一次操作,將x~y區間的所有數增加z;
最後有q個詢問,每一次詢問求出x~y的區間和。
那麼這就可以用差分陣列去實現了
差分陣列不僅僅是乙個優秀的資料結構,還是一種很好的思想
差分陣列的功能是修改區間,查詢點
修改區間的時間複雜度是o(1),查詢點的時間複雜度為o(n)
下面來看是怎麼具體實現的
這裡需要乙個d陣列,d[i]=a[i]-a[i-1]
首先就是需要初始化
d[1]
=a[1];
for(
int i=
2;i<=n;i++
) d[i]
=a[i]
-a[i-1]
;
然後就是處理區間了
void
update
(int x,
int y,
int z)
如何求1到n的和呢??
下面這是o(n)的查詢,其實有o(1)的查詢,只不過是將其求乙個字首和就好
sum[1]
=d[1];
for(
int i=
2;i<=n;i++
) sum[i]
=sum[i-1]
+d[i]
;
下面是求字首和達到o(1)
此時的sum是字首和
sum[1]
=d[1];
t=a[1]
;for
(int i=
2;i<=n;i++
) sum[i]
+=sum[i-1]
+d[i]
+t,t+
=d[i]
;
差分陣列學習筆記
對於已知有n個元素的離線數列d,我們可以建立記錄它每項與前一項差值的差分陣列f 顯然,f 1 d 1 0 d 1 對於整數i 2,n 我們讓f i d i d i 1 區間加減操作 o 1 假如現在對數列中區間 l,r 上的數加上x,令f l x,f r 1 x即可。詢問每一項的值 o n 求差分陣...
演算法筆記 差分陣列
差分陣列是什麼呢?差分陣列是字首和的逆運算,同樣運用到容斥原理 一維 l r a l a r 1 二維 x1 x2 y1 y2 a x1 y1 a x1 y2 1 a x2 1 y1 a x2 1 y2 1 三維 x1 x2 y1 y2 z1 z2 a x1 y1 z1 a x2 1 y1 z1 a...
差分陣列概述
在網上講差分陣列的博文很少,也很難找到。一度以為差分陣列是傳播於小眾的神犇技巧所以一直放著沒有去研習。今天做了 bzoj1635後發現各路神犇都用差分陣列,本蒟卻傻傻寫了線段樹。對於序列a 取a i a i 1 為其差分陣列b i 的值,可以發現,a i bj 1 j i 如 對於序列 a b c ...