給出陣列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國在海岸線沿...