樹狀陣列已經看了好幾天了,一直都是半懂半不懂,實在是忍無可忍了,今天晚上又看了看劉汝佳的***,似乎明白了樹狀陣列到底是怎麼回事,果斷寫篇部落格,明天要把線段樹和字典樹給搞定,不能再肉了~!
樹狀陣列可以很方便的查詢任意區間內所有元素的和,還可以對樹進行修改,時間複雜度位log(n)。
有兩個很重的陣列,a[n] 和 c[n],c 陣列儲存的是一點連續的和。
對於i 節點,如果他是左孩子,那麼父親 節點的編號為 i + lowbit(i),如果是右孩子,那麼父親節點的編號為i - lowbit(i)。 這裡的lowbit(i)指的是i 的最後乙個1 對應的值。 如 10 = 1010.則lowbit(10) = 2。
lowbit函式:
有了c 陣列,我們來求字首si 的和,妍在節點 i 往左走,邊走邊向上。把沿途的c[i]都加起來就是字首和si了。int lowbit(int x)
sum 函式:
同樣道理,當修改某個節點的值得時候,是沿著 節點 i 往右走,邊走,邊向上,把遇到的所有的c[i] 都給修改就行了。int sum(int x)
return num;
}
add 函式:
附上本題**:void add(int x, int y)
}
#include#include#include#include#include#include#includeusing namespace std;
int c[1000100],n;
int lowbit(int x)
int sum(int x)
return num;
}void add(int x, int y)
}int main()
for(i = 0; i < m; i++)
return 0;
}
NYOJ 116 士兵殺敵(二)
時間限制 1000 ms 記憶體限制 65535 kb難度 5 描述 南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍經常想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。南將軍的某次詢問之後士兵i可能又殺敵q人,之後南將軍再詢問的時候,...
nyoj 116 士兵殺敵二
描述 南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍經常想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。南將軍的某次詢問之後士兵i可能又殺敵q人,之後南將軍再詢問的時候,需要考慮到新增的殺敵數。輸入 只有一組測試資料 第一行是兩個整數...
NYOJ 116 士兵殺敵(二)
時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍經常想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。南將軍的某次詢問之後士兵i可能又殺敵q人,之後南將軍再詢問的時候...