首先我們開三個陣列:
我們就形成了下面的這種資料結構:
我們發現對於樹狀陣列 c[i]c[i] 來說,query(i)=a[i]query(i)=a[i], 也就是對應數的值.
如果我們想 2->4 的數加 10 怎麼辦?我們只要修改 b[i] 陣列如下:
我們就形成了下面的資料;
我們不難發現差分陣列的字首和就是對應原陣列的值即:
getsum(i) = a[i];
下列操作與之前的模板**有所不同,這裡的**用到父節點和前管轄域的下標來實現找尋下標,其本質一樣沒有區別,但這樣寫易懂
int n, m;
int c[n+5]
;// c[i] = a[i] - a[i-1],注意這裡多開5個防止資料溢位
inline
intlowbit
(int x)
inline
intfa
(int p)
inline
intleft
(int p)
void
change
(int p,
int v)
void
change_range
(int l,
int r,
int v)
intgetsum
(int p)
luogu p3368 【模板】樹狀陣列 2
思路:簡單的樹狀陣列的應用
#include
#include
using namespace std;
typedef
long
long ll;
const
int maxn =
1e6+
5, maxe =
1e6+5;
//點與邊的數量
const
int n = maxn;
int n, m;
int c[n]
;// c[i] = a[i] - a[i-1]
inline
intlowbit
(int x)
inline
intfa
(int p)
inline
intleft
(int p)
void
change
(int p,
int v)
inline
void
change_range
(int l,
int r,
int v)
intgetsum
(int p)
intmain()
for(
int i =
1; i <= m;
++i)
else
}return0;
}
樹狀陣列 區間修改 單點查詢
說一下差分 現在我們有乙個從小到大的數列a a 1 3 6 8 9 然後還有乙個差分陣列b b 1 2 3 2 1 對應 1,3 1,6 3,8 6,9 8,相信某些同學絕已經看出端倪了.這裡b i a i a i 1 我令a 0 0,故b 1 a 1 int now 0,temp scanf d ...
樹狀陣列區間修改,單點查詢
普通的單點修改單點查詢就不講了,從區間修改和單點查詢講起。原來的值存在a裡面,多建立個陣列c1,注意 c1 i a i a i 1 那麼求a i 的值的時候a i a i 1 c1 i a i 2 c1 i c1 i 1 c1 1 c1 2 c1 i 所以就用c1建立樹狀陣列,便可以很快查詢a i ...
樹狀陣列(區間修改,單點查詢)
如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數數加上x 2.求出某乙個數的值 輸入格式 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含2或4個整數,表示乙個操作,具體如下 操...