23th 樹狀陣列 樹狀陣列1 2

2021-08-03 18:44:38 字數 2465 閱讀 9920

樹狀陣列其實就是巧妙的利用了二分,有效記錄一些段的值。

這圖是網上找的,相當的好。

這些長條就是樹樁陣列記錄的和值。

舉個例子,想找陣列1-11的和,只需要先加數狀陣列的11,在加10,最後加8。

可以看出來這就是乙個每次分一半的數。

實現起來很簡單但是有一些部分很巧妙,比如說lowbit,可以快速找到數的父節點或子節點。

不懂可以上網搜一下樹狀陣列,圖看懂了基本上就懂了。

首先是單點修改,區間求和。

如題,已知有n個元素組成的數列(下標從1開始計數),你需要進行下面兩種操作:

1.將某乙個數加上x

2.求出某區間每乙個數的和

第一行包含兩個整數n、m,分別表示該數列數字的個數和操作的總個數。

第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。

接下來m行每行包含3個整數,表示乙個操作,具體如下:

操作1: 格式:1 x k 含義:將第x個數加上k

操作2: 格式:2 x y 含義:輸出區間[x,y]內每個數的和

輸出包含若干行整數,即為所有操作2的結果。(輸出不超過int型別)

5 5

1 5 4 2 3

1 1 3

2 2 5

1 3 -1

1 4 2

2 1 4

14

16

對於30%的資料:n<=8,m<=10

對於70%的資料:n<=10000,m<=10000

對於100%的資料:n<=100000,m<=100000

#include#include#includeusing namespace std;

const int maxn=100010;

int a[maxn],t[maxn];

int n,m,x,y,way,k;

inline int getint()

while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();

return x*f;

}int lowbit(int x)

void update(int x,int val)//修改

int sum(int x)//求和

int main()

for(int i=1;i<=m;i++)

if(way==2)

}return 0;

}

樹狀陣列沒有圖講不清楚,但是寫起來相當簡單,只要記住兩個函式和乙個lowbit就行了。

其次就是區間修改,單點查詢。

為什麼只能反過來呢,其實這裡我們用差分陣列儲存,這樣區間修改是兩個點的修改,而單點查詢即為差分陣列復原也就是求和。

這樣就能利用樹狀陣列的結構了。

如題,已知乙個數列(下標從1開始計數),你需要進行下面兩種操作:

1.將某區間每乙個數,加上x

2.獲取某乙個數的值

第一行包含兩個整數n、m,分別表示該數列數字的個數和操作的總個數。

第二行包含n個用空格分隔的整數,第i個數字表示數列第i項的初始值。

接下來m行每行包含2或4個整數,表示乙個操作,具體如下:

操作1: 格式:1 x y k 含義:將區間[x,y]內每個數加上k

操作2: 格式:2 x 含義:輸出第x個數的值

輸出包含若干行整數,即為所有操作2的結果。

5 5

1 5 4 2 3

1 2 4 2

2 31 1 5 -1

1 3 5 7

2 4

6

10

對於30%的資料:n<=8,m<=10

對於70%的資料:n<=10000,m<=10000

對於100%的資料:n<=100000,m<=100000

#include#include#includeusing namespace std;

const int maxn=100010;

int a[maxn],t[maxn];

int n,m,x,y,way,k;

inline int getint()

while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();

return x*f;

}int lowbit(int x)

void update(int x,int val)

int sum(int x)

int main()

for(int i=1;i<=m;i++)

if(way==2)

}return 0;

}

樹狀陣列1 樹狀陣列入門

仔細看一下,發現tree的每乙個節點的高度並不是隨意的,而是由它轉成二進位制之後末尾連續零的數量決定的,連續零的數量加1,就是高度,例如 3 11 零的數量為0,加1等於1,所以它的高度就是1 6 110 零的數量為1,加1等於2,所以它的高度就是2 8 1000 零的數量為3,加1等於4,所以它的...

樹狀陣列 瞎bb 樹狀陣列

樹狀陣列是乙個利用一維陣列和位運算組成的求解區間問題的高效資料結構,其構造如圖所示 首先,我們要用它解決單點修改 區間查詢的操作。根據這張圖我們建立乙個陣列bit,下標就是圖中顯示的十進位制數。bit i 就表示了圖中所示的一段區間的和,例如bit 6 sum 5,6 bit 4 sum 1,4 下...

樹狀陣列 二維樹狀陣列模板

樹狀陣列模板 int lowbit int x int add int x,int val int que int x 模板題 題解 include include include using namespace std int c 300000 rank 300000 int n int lowb...