一維樹狀陣列常用的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的陣列,陣列記憶體有資料,對於這些資料一般有兩類操...