題意是給你乙個滿二叉樹,給乙個數字,求以這個數為根的樹中最大值和最小值。
理解樹狀陣列中的lowbit的用法。
說這個之前我先說個叫lowbit的東西,lowbit(k)就是把k的二進位制的高位1全部清空,只留下最低位的1,比如10的二進位制是1010,則lowbit(k)=lowbit(1010)=0010(2進製),介於這個lowbit在下面會經常用到,這裡給乙個非常方便的實現方式,比較普遍的方法lowbit(k)=k&-k,這是位運算,我們知道乙個數加乙個負號是把這個數的二進位製取反+1,如-10的二進位制就是-1010=0101+1=0110(負數的二進位制表示就是正數二進位制的補碼),然後用1010&0110,答案就是0010了!明白了求解lowbit的方法就可以了,繼續下面。介於下面討論十進位制已經沒有意義(這個世界本來就是二進位制的,人非要主觀的構建乙個十進位制),下面所有的數沒有特別說明都當作二進位制。
目前的個人理解就是 lowbit 求出來的是這個根的管轄區域。
**:
1 #include 23int lowbit(int
n) 4
78intmain() 9
18return
0;
19 }
樹狀陣列求解逆序數(SOJ2309)
2012 07 20 20 04 48 soj2309 這是我過的第一道樹狀陣列的題,而且是用來解逆序數的。關於樹狀陣列和陣列的離散化問題,請見 個人覺得這篇博文寫得很好。其實演算法所用的還是樹狀陣列的三個經典函式,只不過稍微改動。include includeusing namespace std...
樹狀陣列POJ2155
poj 2155是一道很不錯的題目,表面上看,這題的要求似乎和樹狀陣列的使用方法恰好相反,改變的是乙個區間,查詢的反而是乙個點。實際上可以通過乙個轉化巧妙的解決。首先對於每個數a定義集合up a 表示 定義集合down a 表示。可以發現對於任何a於是對於這道題目來說,翻轉乙個區間 a,b 為了便於...
poj 2481(樹狀陣列)
這題樹狀陣列明顯可解,不解釋,但是注意有相同的奶牛的處理 include include include include define n 100005 using namespace std int c n tem struct dian d n int cmp dian a,dian b int...