樹狀陣列知識入門

2022-09-08 23:54:25 字數 678 閱讀 7235

這裡有乙個有趣的性質:

設節點編號為x,那麼這個節點管轄的區間為2^k(其中k為x二進位制末尾0的個數)個元素。因為這個區間最後乙個元素必然為ax,

所以很明顯:cn = a(n – 2^k + 1) + … + an

用最小冪 2^k建立樹狀陣列c、並且能進行更新元素值、子串行求和等。對於這個最小冪 2^k(k為x二進位制末尾0的個數)

算這個2^k有乙個快捷的辦法,定義乙個函式如下即可:

int lowerbit(int x)

利用機器補碼特性,也可以寫成:

int lowerbit(int x)

對樹的維護**,也就是對原有資料進行修改

void add(int k,int num)  //從k改變 k後儲存的陣列的和也要改變

}

有了上面的基礎,求和就比較簡單了。比如求0001~0110的和就直接c[0100]+c[0110],分析方法與上面的恰好逆過來,而且寫法也是逆過來的:

int read(int k)//1~k的區間和  

return

sum;

}

陣列和的初始計算,通過lowbit計算出樹狀數值。

void initsum()

}

樹狀陣列1 樹狀陣列入門

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

樹狀陣列 入門

樹狀陣列,乙個用來區間求和修改都為log n 的演算法。在網上資料很多,看起來也不是很難,學習一下!基本上學習樹狀陣列都會看到下面這個圖,這也是最基本的乙個圖,看懂這個以後,對樹狀陣列也就會有 一定的了解了。令這棵樹的結點編號為c1,c2.cn。令每個結點的值為這棵子樹的值的總和,那麼容易發現 c1...

樹狀陣列入門

用office做了一張pdf 這是一維的情形,如果是二維,可以把每一行的一維樹狀陣列看成乙個節點,然後再把二維樹狀陣列看成一維樹狀陣列。好文章 兩道入門題 對於第一題hdu1556 題意 初始陣列元素值都為0,給定區間 x,y 將區間 x,y 每個元素的值 1,最後輸出整個陣列每個元素的值。更新區間...