基本的陣列陣列概念,樹狀陣列利用其特殊的位置可以用二進位制達到log級別的更新,如下圖
核心**
int
sum(int i)
return s;
}void add(int i,int x)
}
lowbit的作用是求出最低位的那個1,為什麼這樣可以求出來呢,是因為計算機中是採用補碼的方式來儲存數值型資料,所以負數的補碼是原碼取反再+1,乙個二進位制數取反後,後面如果現第乙個1,那麼這位將變為0,而他後面的0都取反為1,所以再+1,就是這位變為1,而他後面的都變為0,這樣再與原來的數字進行與運算就能獲得
這裡有乙個特殊的操作lowbit(x) = x&-x,通過這個操作我們就可以訪問到上一層或則下一層,當我們需要去求前3項的和時,只需要向下執行i -= lowbit(i)的操作就行了,從圖中你就會發現這正好就是前兩項的和再加上第三個和,確實就是如此的巧妙,同理我們更新的時候就是不斷向上去更新。因為這裡就利用了二進位制的巧妙,比如當我們在2的乘法的位置的數就就是前面全部的和然後它再減去它的lowbit就是0,因為他只有最高位是1,而非2的乘方的位置,他會一直向下去尋找,知道找到第乙個乘方的位置,加起來就剛好是前n項的和。希望你能明白。
樹狀陣列 單點更新 區間查詢
input 每組測試用例首先一行是2個正整數n和m n 100000,m 10000 其中,n表示士兵的數量,m表示有m個詢問。接下來一行是n個正整數,依次表示n位士兵cf的rating。其中,rating的取值範圍是小於等於5000。最後是m行的詢問,每行包含2個正整數a和b,表示要計算從第a個士...
樹狀陣列區間更新 區間查詢 單點查詢
為了更好地使用複雜度比線段樹更加優化的樹狀陣列,所以必須實現樹狀陣列的區間更新 樹狀陣列時間複雜度為o mlogn 實際用的時候優於線段樹,且寫得少。引入差分陣列,假設初始資料陣列為a,另a 0 0 設要維護的差分陣列為 d i a i a i 1 進一步可知 a i d 1 d 2 d i 即前i...
敵兵布陣(樹狀陣列的單點更新 區間查詢)
c國的死對頭a國這段時間正在進行軍事演習,所以c國間諜頭子derek和他手下tidy又開始忙乎了。a國在海岸線沿直線布置了n個工兵營地,derek和tidy的任務就是要監視這些工兵營地的活動情況。由於採取了某種先進的監測手段,所以每個工兵營地的人數c國都掌握的一清二楚,每個工兵營地的人數都有可能發生...