演算法適用於求前k個整數的和,一般的做法是設定乙個sum陣列來表示
1、問題公升級一下:在查詢的過程中隨時給第x個整數加上乙個整數v,同樣要求查詢第k個整數的和。此時若還是原來的sum陣列,則要遍歷來更新,複雜度為o(n),而用樹狀陣列則時間要更快。
2、再來一題(很簡單的,別怕昂):計算序列中在元素左邊比該元素小的元素個數。可以用hash(即map)來做,也可用樹狀陣列:
update
(x,1);
cout<<
getsum
(x-1
);
方便吧~~~~
下面上樹狀陣列的**:
int
lowbit
(int x)
//返回能整除x的最大2的冪次(例如6的lowbit(6)為2)
int a[
100]
;//原陣列
int c[
100]
;//樹狀陣列,表示從i往前lowbit(i)個整數的和
//下標必須從1開始,c[i]的覆蓋長度為lowbit(i)
intgetsum
(int x)
//返回前x個整數之和
void
update
(int x,
int v)
//將第x個整數加上v
intmain()
}
若要求[x,y]之間內的整數和,只需getsum(y) - getsum(x-1)即可
若不好理解,這裡上個圖:
那麼當數很大的時候如10^9次方,a[i]<=n不成立,樹狀陣列開不了那麼大就沒法使用了呢?不是的哦,例如,如果只需考慮他們之間大小的關係,我們可以把序列看成,其實是等價的。這種技巧成為離散化,此處不做介紹~~(菜是原罪┭┮﹏┭┮)
下面上個可以用樹狀陣列解的pat甲級題:
題目:1057 stack (30分)
演算法 樹狀陣列
相信大家都會樹狀陣列的 單點修改,區間查詢 或者 區間修改,單點查詢 博主就不細講了。但是博主今天發現了乙個神奇的演算法 博主太菜 它可以使用樹狀陣列維護 區間修改,區間查詢 就是乙個優化過的字首和,使查詢和修改協調為 theta log 2n namespace fentree void add ...
演算法 樹狀陣列
要學樹狀陣列的先看懂一幅圖 這就是樹狀陣列的儲存方式。那麼樹狀陣列的優點是什麼呢,允許任意修改,可快速提取出a陣列內數字 據圖可知 c1 a1,c2 a1 a2,c3 a3,c4 a1 a2 a3 a4,c5 a5,c6 a5 a6,c7 a7,c8 a1 a2 a3 a4 a5 a6 a7 a8,...
演算法(十三)樹狀陣列
問題描述 小蔥喜歡除法,所以他給了你n個數a1,a2,an,並且希望你執行m次操作,每次操作可能有以下兩種 給你三個數l,r,v,你需要將al,al 1,ar之間所有v的倍數除以v。給你兩個數l,r,你需要回答al al 1 ar的值是多少。輸入格式 第一行兩個整數n,m,代表數的個數和操作的次數。...