一維樹狀陣列和二維樹狀陣列

2021-08-04 19:01:49 字數 2681 閱讀 9600

hdu1166敵兵布陣

樹狀陣列適用於頻繁對陣列元素進行修改,同時又要查詢陣列內任一區間元素之和。

聽說線段樹也可以做,線段樹的作用:點修改,區間查詢,區間修改。

#include

#include

#include

#include

using

namespace

std;

int a[50005]=;

int c[50005]=;

int n;

void add(int k,int num)//修改值

}void sub(int k,int num)

}int read(int k)//求區間和

return sum;

}int main()

/* for(i=1;i<=n;++i)

;printf("case %d:\n",k);

while(scanf("%s",str)!=eof)

if(strcmp(str,"sub")==0)

/*for(i=1;i<=n;++i)

}return

0;}

樹狀陣列的變形,需要將題意轉換一下,變成求區間和

poj2352

題意是數乙個星星左下方有幾個星星,他的等級就是幾

#include

#include

#include

#include

using

namespace

std;

//樹狀陣列不能處理(0,0)點的問題,所以要將所有的座標+1

int c[32005]=;

int b[15005]=;

void add(int k,int num)

}int read(int k)

//cout

}int main()

for(i=0;iprintf("%d\n",b[i]);

}return

0;}

二維樹狀陣列,只是將x軸樹狀化,再將y軸樹狀化

一維樹狀陣列很容易擴充套件到二維,在二維情況下:陣列a的樹狀陣列定義為:

c[x][y] = ∑ a[i][j], 其中,

x-lowbit(x) + 1 <= i <= x,

y-lowbit(y) + 1 <= j <= y.

例:舉個例子來看看c的組成。

設原始二維陣列為:

a=,

, ,

}; 那麼它對應的二維樹狀陣列c呢?

記: b[1]= 這是第一行的一維樹狀陣列

b[2]= 這是第二行的一維樹狀陣列

b[3]= 這是第三行的一維樹狀陣列

b[4]= 這是第四行的一維樹狀陣列

那麼:

c[1][1]=a11,c[1][2]=a11+a12,c[1][3]=a13,c[1][4]=a11+a12+a13+a14,c[1][5]=a15,c[1][6]=a15+a16,…

這是a第一行的一維樹狀陣列

c[2][1]=a11+a21,c[2][2]=a11+a12+a21+a22,c[2][3]=a13+a23,c[2][4]=a11+a12+a13+a14+a21+a22+a23+a24,

c[2][5]=a15+a25,c[2][6]=a15+a16+a25+a26,…

這是a陣列第一行與第二行相加後的樹狀陣列

c[3][1]=a31,c[3][2]=a31+a32,c[3][3]=a33,c[3][4]=a31+a32+a33+a34,c[3][5]=a35,c[3][6]=a35+a36,…

這是a第三行的一維樹狀陣列

c[4][1]=a11+a21+a31+a41,c[4][2]=a11+a12+a21+a22+a31+a32+a41+a42,c[4][3]=a13+a23+a33+a43,…

這是a陣列第一行+第二行+第三行+第四行後的樹狀陣列

poj2155

這道題有採用了乙個特殊的方法,如果乙個乙個的去修改值,那肯定會超時

先舉個一維的例子:你要使區間[x,y]全部加上乙個值v,結合樹狀陣列的功能,可以類似掃氣球那樣,在x處加v, y+1處減1。這樣如果你要求x處的值,就轉換成求[1,x]的和了,例如 :乙個n=6的陣列,一開始為0 0 0 0 0 0, 在[2,4]加上2後變成 0 2 0 0 -2 0 這樣字首和 sum[1]=0;sum[2]=2;sum[3]=2;sum[4]=2;sum[5]=0;sum[6]=0;依次代表了每個數的值。

對二維來說可以應用類似的方法

從一維樹狀陣列到二維樹狀陣列

今天接觸二維樹狀陣列。其實,要明確的一點是,不管是一維還是二維樹狀陣列,都只是工具而已,只是幫助我們更快地求和,查詢,樹狀陣列的這些操作都可以用我們平常的方法求,例如一直加。面對乙個二維陣列,我們要求它們的和,會怎麼做呢?先求出第一行的總和 再求出第二行的總和 再求出第三行的總和 求出最後一行的總和...

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

樹狀陣列模板 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...

樹狀陣列及二維樹狀陣列

一直以為樹狀陣列能用線段樹水過去,直到我今天碰上了樹狀陣列模板題。然後就是開始認真的學習樹狀陣列,突然發現怎麼這麼好寫qwqqqq。部分 一.樹狀陣列 樹狀陣列是一種資料結構,核心思想是利用二進位制的補碼思想。首先就是樹狀陣列的結構圖 然後我們對他進行變形 是不是感覺更好理解了呢?然後我們對其進行標...