題目大意:輸入乙個數n,表示有n個氣球,編號為1 , 2 ,…… ,n,然後有n次操作,每次操作輸入兩個數a , b。表示給編號為[a , b]所在區間的氣球染色, 然後依次求出每個氣球被染色的次數.
很容易想到用線段樹來求解(成段修改區間值,單點查詢),也可以用樹狀陣列來寫。 不過很有意思的是, 樹狀陣列一般是用於單點修改,查詢區間和的問題, 而這個題要求更新區間,查詢單點。因此更新的時候左端點+1, 右端點的下乙個位置-1,這樣子查詢點也就變成求字首和了。
#include
#include
using
namespace
std;
const
int maxn = 100010;
int c[maxn] , a[maxn] , n;
int lowbit(int x)
void add(int x , int v)
}int sum(int x)
return rel;
}int main()
for(int i = 1; i < n; i++) cout
<< sum(i) << " ";
cout
<< sum(n) << endl;
}return
0;}
上述處理方式是樹狀陣列的向上更新 , 向下求和。還有一種處理辦法是向下更新 , 向上求和。即採用向下更新的方式將左端點前乙個位置-1,右端點+1。然後向上求字首和。
#include
#include
using
namespace
std;
const
int maxn = 100010;
int a[maxn] , c[maxn] , n;
int lowbit(int x)
void add(int x , int v)
}int sum(int x)
return rel;
}int main()
for(int i = 1; i < n; i++) cout
<< sum(i) << " ";
cout
<< sum(n) << endl;
}return
0;}
Binary Indexed Tree 樹狀陣列
做leetcode 做到meetingroomii的時候我知道不用線段樹或者樹狀陣列是不太好搞了。還是來學習一下吧。樹狀陣列算是線段樹的一種特殊情況 子集 所以樹狀陣列能解決的問題線段樹一定能做,但線段樹能做的樹狀陣列不一定能做。對乙個陣列進行如下操作 update i1,i2,operation ...
數星星 樹狀陣列
題目描述 天空中有一些星星,這些星星都在不同的位置,每個星星有個座標。如果乙個星星的左下方 包含正左和正下 有 k 顆星星,就說這顆星星是 k 級的。例如,上圖中星星 5 是 3 級的 1,2,4 在它左下 星星 2,4 是 1 級的。例圖中有 1 個 0 級,2 個 1 級,1 個 2 級,1 個...
數星星(樹狀陣列)
天空中有一些星星,這些星星都在不同的位置,每個星星有個座標。如果乙個星星的左下方 包含正左和正下 有 k 顆星星,就說這顆星星是 k 級的。例如,上圖中星星 5 是 3 級的 1,2,4 在它左下 星星 2,4 是 1 級的。例圖中有 1 個 0 級,2 個 1 級,1 個 2 級,1 個 3 級的...