士兵殺敵(二)

2021-06-19 08:13:42 字數 1118 閱讀 9485

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:5 描述

南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。

小工是南將軍手下的軍師,南將軍經常想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。

南將軍的某次詢問之後士兵i可能又殺敵q人,之後南將軍再詢問的時候,需要考慮到新增的殺敵數。

輸入

只有一組測試資料

第一行是兩個整數n,m,其中n表示士兵的個數(1

輸出對於每次查詢,輸出乙個整數r表示第m號士兵到第n號士兵的總殺敵數,每組輸出佔一行

樣例輸入

5 6

1 2 3 4 5

query 1 3

add 1 2

query 1 3

add 2 3

query 1 2

query 1 5

樣例輸出

688

20

思路:運用數狀陣列儲存殺敵數, 可極大縮短用時,  用樹狀陣列的時候有個很牛x的公式(x&-x)(不會推導,記住就好)用它可以求出自身父節點和上乙個管轄範圍的父節點的座標, 有了它, 樹狀陣列就很簡單了, 注意在改動資料時, 這個節點的所有管轄節點(父節點)都需要變動, 還有求前n個節點和時, 要把所有管轄範圍父節點加一遍就是結果(快就快在這, 不用遍歷所有節點就可求和)。

#include #include #include #define max 1000001

int n, bit[max], data[max]; //bit:數狀陣列, data:記錄資料

int lowbit(int x)

int sumbit(int x) //求前n個節點的和

return temp;

}int addbit(int x, int value) //節點x及所有父節點都需要加value

}int main()

for(i = 1; i <= n; i++)

}while(m--)

else

}return 0;

}

士兵殺敵(二)

時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍經常想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。南將軍的某次詢問之後士兵i可能又殺敵q人,之後南將軍再詢問的時候...

士兵殺敵(二)

時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍經常想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。南將軍的某次詢問之後士兵i可能又殺敵q人,之後南將軍再詢問的時候...

士兵殺敵(二)

士兵殺敵 二 時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍經常想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。南將軍的某次詢問之後士兵i可能又殺敵q人,之後南將...