樹狀陣列之區間修改,單點查詢

2021-10-19 08:12:42 字數 1662 閱讀 9988

首先我們開三個陣列:

我們就形成了下面的這種資料結構:

我們發現對於樹狀陣列 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個整數,表示乙個操作,具體如下 操...