樹狀陣列(一維)例題 HDU 1166敵兵布陣

2021-07-03 09:54:36 字數 1226 閱讀 4037

對於普通陣列,其修改的時間複雜度位o(1),而求陣列中某一段的數值和的時間複雜度為o(n),因此對於n的值過大的情況,普通陣列的時間複雜度我們是接受不了的。

對於樹狀陣列這種資料結構,它能在o(logn)內對陣列的值進行修改和查詢某一段數值的和。

樹狀陣列是乙個查詢和修改複雜度都為log(n)的資料結構。

假設a陣列為儲存原來的值得陣列,c為樹狀陣列。我們定義:c[i] = a[i - 2^k + 1] + ..... + a[i]  其中k為i用二進位制表示時的末尾0的個數。例如:i= 10100,則k = 2,i = 11000,則k = 3;其中我們有一種快速的求解2^k的值得方法:

int lowbit(int x)//計算lowbit

應用:對於乙個陣列,如果有多次操作,每次的操作有兩種(1)修改陣列中某一元素的值。(2)求某一段區間的和。

例題:hdu——1166

int lowbit(int x)//計算lowbit

void add(int i,int val)//將第i個元素加val

}int sum(int i)//求前i項和

return s;

}int main()

while(1)

else if(strcmp(str,"add")==0)//第a個營地增加b人

else if(strcmp(str,"sub")==0)//第a個營地減少b人}}

return 0;

}

樹狀陣列 HDU1166

繼續上次那題,我們現在採用樹狀陣列來解。樹狀陣列主要用來進行區間求和統計和定點更新操作,樹狀陣列的儲存是如下方式的 假設陣列a為a 1 a 2 a 3 a n 現在我們另陣列c 1 a 1 c 2 a 1 a 2 c 3 a 3 c 4 a 1 a 2 a 3 a 4 這是啥結構呢?其實c i a ...

樹狀陣列 HDU1166

題意為 t組測試陣列,跟著乙個整數n,n n 50000 表示n個營地 n後面跟著n個數ai 1 50 表示每個營地人數。然後輸入三種操作 最多有40000條操作 1.add x y x營地增加y人。2.query x y 查詢x y營地的總人數。3.sub x y x營地減少y人。end 結束。如...

Hdu1166 樹狀陣列

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