HDOJ 1166 敵兵布陣(一維樹狀陣列)

2021-07-10 11:28:09 字數 781 閱讀 9589

題目是一道很經典的一維樹狀陣列的題,改動一維陣列中的乙個點,求一段連續區間的和。原理可以去看訓練指南,在打**的時候要回想起那幅經典的圖,修改某個值的時候,是向右上角爬,從左子樹到父結點,所以是i += lowbit(i)。而查詢某一段區間的時候,是向左上角爬,從右子樹到父結點,所以是m -= lowbit(m)。

query(i)得到的是[1,i]的和

add(i,d)是給第i個數加上d,sub就是減去d

這道題用iostream會tle, 還有c字串中兩個字串的比較要用strcmp。

樹狀陣列開得和普通陣列所需要的量一樣大就可以。

#include#include#include#include#include#include#define n 50001

#define vn 50001

using namespace std;

int n, a[n], c[vn];

int lowbit(int x)

int query(int m)

return sum;

}void add(int i, int x)

}void sub(int i, int x)

}int main()

while (scanf("%s", s) && strcmp(s, "end") != 0)

if (strcmp(s, "add") == 0)

if (strcmp(s, "sub") == 0)}}

return 0;

}

HDOJ 1166 敵兵布陣

c國的死對頭a國這段時間正在進行軍事演習,所以c國間諜頭子derek和他手下tidy又開始忙乎了。a國在海岸線沿直線布置了n個工兵營地,derek和tidy的任務就是要監視這些工兵營地的活動情況。由於採取了某種先進的監測手段,所以每個工兵營地的人數c國都掌握的一清二楚,每個工兵營地的人數都有可能發生...

hdoj 1166 敵兵布陣

暴力超時,這道題可以用線段樹做,因為更新的是單個節點,我們也可以用陣列陣列來做,我將兩種方法的 都給出 陣列陣列最適宜的用途就是區間求和和點的更新,但樹狀陣列並不適用於區間的更新問題,也不是做不到,比較麻煩且難理解,有興趣的可以看看這個 樹狀陣列 includeint n,ans 50005 f 5...

(線段樹)hdoj1166 敵兵布陣

c國的死對頭a國這段時間正在進行軍事演習,所以c國間諜頭子derek和他手下tidy又開始忙乎了。a國在海岸線沿直線布置了n個工兵營地,derek和tidy的任務就是要監視這些工兵營地的活動情況。由於採取了某種先進的監測手段,所以每個工兵營地的人數c國都掌握的一清二楚,每個工兵營地的人數都有可能發生...