這題可以說是樹狀陣列區間更新,單點查詢的模板題。
對於樹狀陣列的區間更新,單點查詢,其實就是維護乙個差分陣列。以該題為例:
定義兩個陣列a,b。a陣列表示氣球塗色次數,初始均為0。設b[n] = a[n] - a[n-1](即b陣列是a陣列的乙個差分陣列),因為a陣列初始均為0,所以b陣列初始也為0,且b[1]+b[2]+…+b[n] = a[n] - a[0] = a[n]。假設
這裡我們
要對區間
為[l,
r]的氣
球圖n次
色,也就
是對a[
]陣列的
[l,r
]區間都
加n。即
:a[1
]′=a
[1],
…,a[
l−1]
′=a[
l−1]
,a[l
]′=a
[l]+
n,…,
a[r]
′=a[
r]+n
,a[r
+1]′
=a[r
+1],
…那麼對
於b[1
],…,
b[l−
1],b
[l+1
],…,
b[r]
,b[r
+2],
…不會變
(區間外
部不變導
致b[1
−l]和
b[r+
2−n]
不變,區
間內部增
量相同導
致b[l
+1−r
]不變)
,但是b
[l]會
+n,b
[r+1
]會−n
。 這就轉變成了對b陣列的單點更新、區間查詢。
#include
using
namespace
std;
const
int maxn = 1e5+5;
int sz[maxn],n;
int lowbit(int x)
int update(int x,int num)
}int query(int x)
return ans;
}int main()
for(int i=1;i<=n;i++) printf("%d%c",query(i),(i==n ? '\n' : ' '));
}return
0;}
HDU 1556樹狀陣列求解
f color the ball time limit 3000msmemory limit 32768kb64bit io format i64d i64u submit status practice hdu 1556 description n個氣球排成一排,從左到右依次編號為1,2,3.n....
樹狀陣列專題 六 hdu1556
這是屬於樹狀陣列的應用二.對一段區間進行修改.然後訪問點的更新值.如何對於一段區間 a,b 更新的情況updata a,1 updata b 1,1 的理解.因為是對於 a,b 區間內的更新.那麼只更新a是如何去理解呢.對於getsum i 得到的是1 i的總和.那麼updata a 以後.對於a ...
樹狀陣列 or 線段樹 (HDU 1556)
樹狀陣列 例題 hdu 1556 n個氣球排成一排,從左到右依次編號為1,2,3.n.每次給定2個整數a b a b lele便為騎上他的 小飛鴿 牌電動車從氣球a開始到氣球b依次給每個氣球塗一次顏色。但是n次以後lele已經忘記了第i個氣球已經塗過幾次顏色了,你能幫他算出每個氣球被塗過幾次顏色嗎?...