數星星(樹狀陣列的應用)

2022-09-23 11:27:08 字數 1585 閱讀 4867

1265. 數星星

天空中有一些星星,這些星星都在不同的位置,每個星星有個座標。

如果乙個星星的左下方(包含正左和正下)有 k

'>k

k 顆星星,就說這顆星星是 k

'>k

k 級的。

例如,上圖中星星 5

'>5

5 是 3

'>3

3 級的(1,2

,4'>1,2,4

1,2,4 在它左下),星星 2,4

'>2,4

2,4 是 1

'>1

1 級的。

例圖中有 1

'>1

1 個 0

'>0

0 級,2

'>2

2 個 1

'>1

1 級,1

'>1

1 個 2

'>2

2 級,1

'>1

1 個 3

'>3

3 級的星星。

給定星星的位置,輸出各級星星的數目。

換句話說,給定 n

'>n

n 個點,定義每個點的等級是在該點左下方(含正左、正下)的點的數目,試統計每個等級有多少個點。

輸入格式

第一行乙個整數 n

'>n

n,表示星星的數目;

接下來 n

'>n

n 行給出每顆星星的座標,座標用兩個整數 x,y

'>x,y

x,y 表示;

不會有星星重疊。星星按 y

'>y

y 座標增序給出,y

'>y

y 座標相同的按 x

'>x

x 座標增序給出。

輸出格式

n'>n

n 行,每行乙個整數,分別是 0

'>0

0 級,1

'>1

1 級,2

'>2

2 級,……,n−1

'>n−1

n−1 級的星星的數目。

資料範圍1≤

n≤15000

'>1≤n≤15000

1≤n≤15000,0≤

x,y≤

32000

'>0≤x,y≤32000

**:

#include#include

#include

#include

using

namespace

std;

const

int n=32010

;int level[n];//

存各個等級的星星數

int tr[n];//

樹狀陣列

intn;

int lowbit(int

x)void add(int x)

int sum(int x)

intmain()

for(int i=0;iendl;

return0;

}

數星星 樹狀陣列

題目描述 天空中有一些星星,這些星星都在不同的位置,每個星星有個座標。如果乙個星星的左下方 包含正左和正下 有 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 級的...

1265 數星星 樹狀陣列

思路 因為給定的座標已經按照縱座標排好序了,那麼對於每個點 x,y 它是第幾層取決於它左下部有多少個點,因為他的縱座標是最大的,那麼我們就利用樹狀陣列求出字首和s 每次在x位置處,單點修改此點的值 1 即第s層的星星數 1。再把這個點放入樹狀陣列中即可。include include define ...