樹狀陣列應用

2021-06-28 08:21:23 字數 1938 閱讀 8895

一維樹狀陣列常用的3

個函式

int lowbit(int x) //取x的最低位1,比如4,則返回4,如5,則返回1  

void update(int i, int val) //將第i個元素增加val

} int sum(int i) //求前i項的和

return s;

}

以下陣列下標均預設從1開始

應用一假如給你乙個陣列a[ ] = ,

求b[i]

,b[i] 

表示在a[1],a[2]...a[i-1]中(

即位置i

的左邊)小於等於a[i]的數的個數。對此例

b = 

。 那麼該如何去求得

b[i]呢?

解法:假如要得到b[4]的值,

對於a[4] = 4. 

我們 只要得到在

a[1],a[2],a[3] 

中出現小於等於

4的個數,即

1,2,3,4

的個數,

此例即為

2. a[1] = 2 < a[4], a[3] = 3 < a[4]. 

所以b[4] = 2;

其他的以此類推. 求

b[i]

的值,需要得到在

a[1],a[2]....a[i-1]

中出現小於等於

a[i]

的個數,即

1,2...a[i]

的個數. 

相當於求前

a[i]

項的和,可用到樹狀陣列. 

具體操作

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

應用二假如給你乙個陣列a[ ] = ,

求b[i]

,b[i] 

表示在a[1],a[2]...a[i-1]中(

即位置i

的左邊)大於等於a[i]的數的個數。對此例

b = 

。 那麼該如何去求得

b[i]呢?

解法1: 

只需要先將陣列

a倒過來編號,即將

a轉換為,

a =.

此時具體的操作如應用一

解法2:改變更新路徑和求和路徑

void update(int x, int val)  

} int getsum(int x) ,求

b[i]

,b[i] 

表示在a[i],a[i+1]...a[n]中(

即位置i

的右邊)小於等於a[i]的數的個數。對此例

b = 

。 那麼該如何去求得

b[i]呢?

操作:應用一位置i

的左邊,應用三是位置

i的右邊。 然後只需要在應用一的基礎上從後往前操作即可

for(int i=n; i>=1; i--)

應用四假如給你乙個陣列a[ ] = ,

求b[i]

,b[i] 

表示在a[i],a[i+1]...a[n]中(

即位置i

的右邊)大於等於a[i]的數的個數。對此例

b = 

。 那麼該如何去求得

b[i]呢?

操作:只需將陣列a

倒過來編號,即將

a轉化為 

a= 然後利用應用三

二維樹狀陣列

int lowbit(int x)  

void update(int x, int y, int val) //將 a[x][y] 的值增加val

} return s;

}

樹狀陣列的應用

樹狀陣列的應用1 求逆序數 首先考慮將輸入陣列離散化,因為題目要求輸入的數值可以達到10的9次方,肯定不會開出那麼大的陣列。1.定義乙個結構體 val儲存原值,pos儲存原來在陣列中的位置 2.在對原結構體陣列對val值排序 3.定義儲存離散化資料的陣列flect,flect node i pos ...

樹狀陣列的應用

include include define lowbit i i i const int maxn 100010 int c maxn 樹狀陣列 getsum函式返回前x個整數之和 int getsum int x return sum 返回和 update函式將第x個整數加上v void upd...

2015 7 14 樹狀陣列及其初步應用

樹狀陣列 binary indexed tree 是一種設計新穎的陣列結構,它能夠高效地獲取陣列中連續n個數的和。概括說,樹狀陣列通常用於解決以下問題 陣列中的元素可能不斷地被修改,怎樣才能快速地獲取連續幾個數的和?舉個簡單的例子 現在有乙個長度為n的陣列,陣列記憶體有資料,對於這些資料一般有兩類操...