HDU Color the ball 樹狀陣列

2021-07-05 00:13:02 字數 1183 閱讀 3108

題目大意:輸入乙個數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 級的...