題目是一道很經典的一維樹狀陣列的題,改動一維陣列中的乙個點,求一段連續區間的和。原理可以去看訓練指南,在打**的時候要回想起那幅經典的圖,修改某個值的時候,是向右上角爬,從左子樹到父結點,所以是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國都掌握的一清二楚,每個工兵營地的人數都有可能發生...