題意為:
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:結束。
如果按常規方法乙個乙個查詢人數,時間複雜度為o(n*m),即2*10^9,超時。
下面看看樹狀陣列:
a陣列儲存營地人數,現在我們定義乙個索引陣列c,儲存方式如圖所示。
定義乙個函式fsum(),通過索引陣列求前n項和。fsum()按二進位制求和;
比如:fsum(5)=c[5]+c[4] fsum(7)=c[7]+c[6]+c[4].
101 100 111 110 100 .
每次加上x轉為二進位制,去掉最後一位1得到的數。
**如下:
#include #include #include #define max 50005
int c[max];
inline int lowbit(int x) //inline為內聯函式,節省時間
// 比如 x=6=1 1 0 lowbit(x)= 1 0 =2.
int fsum(int x) //通過索引陣列c求前x的和。
return sum;
}void add(int x,int v,int n) //新增乙個數v,更新索引陣列c
}int main()
printf("case %d:\n",j);
char s[20];
while(scanf("%s",s) && s[0]!='e')
}return 0;
}
樹狀陣列的難點在於理解索引陣列c的儲存方式,以及通過索引陣列求前x項的和。 樹狀陣列 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 樹狀陣列
problem description c國的死對頭a國這段時間正在進行軍事演習,所以c國間諜頭子derek和他手下tidy又開始忙乎了。a國在海岸線沿直線布置了n個工兵營地,derek和tidy的任務就是要監視這些工兵營地的活動情況。由於採取了某種先進的監測手段,所以每個工兵營地的人數c國都掌握的...
樹狀陣列 HDU 1166
真是個入門題啊 直接考應用的 注意兩點 1,hdu又卡輸入輸出,老手段了,習慣寫scanf吧 2,減去b其實就是加上 b 要有計算機人的思想 只改了輸入輸出,但是在差不多1e9的資料下面 快了不止一倍啊。離散化啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 不難的啊吧啊啊啊啊啊啊啊啊啊啊...