NYOJ 116 士兵殺敵 二

2021-06-20 22:45:11 字數 1080 閱讀 3911

樹狀陣列已經看了好幾天了,一直都是半懂半不懂,實在是忍無可忍了,今天晚上又看了看劉汝佳的***,似乎明白了樹狀陣列到底是怎麼回事,果斷寫篇部落格,明天要把線段樹和字典樹給搞定,不能再肉了~!

樹狀陣列可以很方便的查詢任意區間內所有元素的和,還可以對樹進行修改,時間複雜度位log(n)。

有兩個很重的陣列,a[n] 和 c[n],c 陣列儲存的是一點連續的和。

對於i 節點,如果他是左孩子,那麼父親 節點的編號為 i + lowbit(i),如果是右孩子,那麼父親節點的編號為i - lowbit(i)。 這裡的lowbit(i)指的是i 的最後乙個1 對應的值。 如 10 = 1010.則lowbit(10) = 2。

lowbit函式:

int lowbit(int x)

有了c 陣列,我們來求字首si 的和,妍在節點 i 往左走,邊走邊向上。把沿途的c[i]都加起來就是字首和si了。

sum 函式:

int sum(int x)

return num;

}

同樣道理,當修改某個節點的值得時候,是沿著 節點 i 往右走,邊走,邊向上,把遇到的所有的c[i] 都給修改就行了。

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人,之後南將軍再詢問的時候...