HDU 1166 敵兵布陣(樹狀陣列)

2021-08-03 06:20:35 字數 961 閱讀 4176

給出陣列a的每個元素的值,執行以下三種操作:

add(i, j):a[i]加上j

sub(i, j):a[i]減去j

query(i, j):求a[i], a[i+1]…a[j]的和

樹狀陣列的裸題。

樹狀陣列( binary indexed tree,bit,二分索引樹)的詳細內容,請見夜深人靜寫演算法(三) - 樹狀陣列。

總結一下原博文的定義:

下面是樹狀陣列支援的操作:

因此,利用樹狀陣列解題,關鍵就是將對原陣列a的操作對映到對樹狀陣列c的操作。

本題用到的是樹狀陣列的puiq模型(point update interval query)。

add和sub操作可以直接呼叫,query操作可以用sum(j) - sum(i-1)來處理。

#include 

using

namespace

std;

const

int maxn = 50005;

int tree[maxn], n; //tree[1...n]是樹狀陣列

int lowbit(int x) //求2^k,k為x二進位制末尾0的個數

int sum(int x) //統計原陣列a[1..x]元素值的和

void add(int x, int v) //原陣列a[x]加上v

void solve()

string s;

int a, b;

while (cin >> s && s != "end")

else

if (s == "add") //對原陣列a[a]加上b

else

if (s == "sub") //對原陣列a[a]減去b

}}int main()

return

0;}

HDU 1166 敵兵布陣 樹狀陣列

用樹狀陣列很簡單,太晚了,貼下 睡覺去。另,研究線段樹的時候,發現網上流傳著有幾種不同的線段樹,最正宗的是以單位區間為單位,只能處理線段 另外還有幾種葉子結點是點的,這種也可以用來處理點,所以這題是可以用這種線段樹做的。還搞不太清楚它們之間的關係。mark一下,明天再說。include includ...

HDU 1166 敵兵布陣 樹狀陣列

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

HDU 1166 敵兵布陣 (樹狀陣列)

敵兵布陣 time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status description c國的死對頭a國這段時間正在進行軍事演習,所以c國間諜頭子derek和他手下tidy又開始忙乎了。a國在海岸線沿...