之前寫的題也遇到過用樹狀陣列,當時都是現查現學,而且總是搞不懂,今天又遇到了一道求區間和的題,不管最後是不是用樹狀陣列可以a,但是既然已經想到了這,就打算好好學習一下。可惜之前查到的資料都沒有儲存記錄,所以又重新查了些資料,彙總學習如下(文末附上樹狀陣列的詳細**)。
樹狀陣列主要用到的操作:
int lowbit(int n)
lowbit操作來取出x的最後乙個1。-x = ~x + 1,~x將x最末尾的連續0變為了連續的1,+1則保證了將連續的1和緊接著的0置為原來的1和連續的0,而其他位則不變,即為-x的狀態,與上x,則除了最末尾的1,其餘的均被置為了0。假如x = 1000 1000,則-x = 0111 1000,兩者與的結果為 0000 1000。
求字首和(樹狀陣列的經典應用)
//求前n項的和
//其中c為樹狀陣列
int sum(int n)
return sum;
}
對陣列中的某個元素進行修改(增加或減少),需要修改相應的字首和。
//c為樹狀陣列,n 為陣列大小,i為要修改的元素的下標
void modify(int i, int x)
return;
}
樹狀陣列學習
我覺得,樹狀陣列挺重要的就是那個 lower x x x 我說說我的理解吧。每乙個正整數都可以拆分成 2 的某些冪之和,例如 15 8 4 2 1 6 4 2 7 4 2 1 感覺可以解釋lca的倍增跳 那麼轉換成二進位制是什麼樣的呢?15 十進位制 1111 1000 100 10 1 6 十進位...
樹狀陣列學習
樹狀陣列與並查集類似,是一種資料結構,它可以用來維護字首和問題 不過,利用字首和和查分的思想,我們也可以用樹狀陣列解決區間問題 與線段樹不同,目前我暫且認為線段樹解決最值問題,而樹狀陣列解決求和問題 樹狀陣列原理建立在二叉樹上 利用lowbit運算實現向根節點儲存的原理 介紹lowbit的程式實現只...
樹狀陣列學習小結
樹狀陣列,又稱二進位制索引樹,英文名binary indexed tree。一 樹狀陣列的用途 主要用來求解數列的字首和,a 0 a 1 a n 由此引申出三模擬較常見問題 1 單點更新,區間求值。hdu1166 2 區間更新,單點求值。hdu1556 3 求逆序對。hdu2838 二 樹狀陣列的表...