1. 程式人生 > >1166 敵兵佈陣(HDU)

1166 敵兵佈陣(HDU)

題意理解

1到N個工兵營地,已知每個工兵營地的人數,每個營地的人數有增有減,問如果查詢任意連續個營地的人數怎麼做?

問題分析

用樹狀陣列 資料結構

轉一:求連續營地人數和,可以轉化為前j個營地人數減去前i-1個營地人數的差。問題是字首和的求法。符合樹狀陣列特徵

轉二:建立樹狀陣列,從前到後依次建立元素,因為是樹狀陣列,前面的值會被累加到後面的元素上,思路轉化為對每個元素,一次迴圈加到後面所有涉及到這個元素的累加的元素位置上,位置用lsb計算,lsb是least significant bit,最不重要bit位,即最右邊的1的值對應的位置。

轉三:求累計和,依次加上前面減bit位的位置上對應的元素值,即為所求的字首和。

其他

結果展示需要特殊的字串case 1:,這個沒注意看結果

初始化樹狀陣列是,位數設定為N,但樹狀陣列是從1開始的,所以第N位沒有重置成功,導致結果WA。

樹狀陣列的特點是從1開始

樹狀陣列計算充分利用了二進位制1的位置資訊,很巧妙

直接計算最後一個1的方法也很特別,與運算,同真為真

memset方法是string.h裡的,引數是memset(array,0,sizeof(array))

程式碼連結

https://github.com/xierensong/learngit/blob/master/hdu/h1166.cpp