一本通 1536 數星星 Stars(樹狀陣列)

2021-10-09 06:46:49 字數 1506 閱讀 3533

題目傳送門

【題目描述】

原題來自:ural 1028

天空中有一些星星,這些星星都在不同的位置,每個星星有個座標。如果乙個星星的左下方(包含正左和正下)有 k

顆星星,就說這顆星星是 k級的。

例如,上圖中星星 5

是 3 級的(1,2,4 在它左下),星星 2,4 是 1 級的。例圖中有 1 個 0 級,2 個 1 級,1 個 2 級,1 個 3

級的星星。

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

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

【輸入】

第一行乙個整數 n,表示星星的數目;

接下來 n行給出每顆星星的座標,座標用兩個整數 x,y表示;

不會有星星重疊。星星按 y座標增序給出,y 座標相同的按 x座標增序給出。

【輸出】

n行,每行乙個整數,分別是 0 級,1 級,2 級,……,n−1級的星星的數目。

【輸入樣例】5

1 15 1

7 13 3

5 5【輸出樣例】1

2110

【提示】

對於全部資料,1≤n≤1.5×104,0≤x,y≤3.2×104。

對於每個星星按y座標從小到大排序,相同y座標按x座標從小到大排序。輸入順序已排好序,那麼只要依次統計星星i之前x座標小於等於i.x的星星有多少,即是星星i的級別。y座標沒用,顯然是一維樹狀陣列應用。

設陣列a[x]初始為0,表示在x座標處星星的個數,則求和a[0] ~ a[x]則為該星星的等級。

有乙個地方尤其要注意,樹狀陣列是以1號為起始的,而且只能用1號。x可能為0,為0會時陷入死迴圈,處理時要將所有的x+1。

還有就是x的範圍不能事先確定,在update的時候直接加到x取值範圍的最大值,即32001,或者在輸入的時候找乙個x的最大值。

樹狀陣列(不會的請進)

#include

#include

using

namespace std;

int n,x,y,s,a[

32005

],b[

32005];

intcx

(int x)

//查詢

void

update

(int x,

int y)

//更改

intmain()

for(

int i=

1;i<=n;i++

)printf

("%d\n"

,b[i-1]);}

一本通1536數星星 Stars

時間限制 256 ms 記憶體限制 65536 kb 原題來自 ural 1028 天空中有一些星星,這些星星都在不同的位置,每個星星有個座標。如果乙個星星的左下方 包含正左和正下 有 k k顆星星,就說這顆星星是 k k 級的。例如,上圖中星星 5 5是 3 3級的 1,2 4 1,2,4在它左下...

一本通1361 產生數 Produce

1361 產生數 produce 題目描述 給出乙個整數n n 2000 和k個變換規則 k 15 規則 1個數字可以變換成另1個數字 規則中,右邊的數字不能為零。例如 n 234,k 2規則為 2 5 3 6 上面的整數234經過變換後可能產生出的整數為 包括原數 234,534,264,564共...

佇列(一本通)

這道題重點是關係的轉換和初始化 include include include includeusing namespace std int a 101 記錄接著的的那個節點 int n,m int main int ans void bfs int x,int y int main cout in...