1166 敵兵佈陣(HDU)
阿新 • • 發佈:2019-01-14
題意理解
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