題目傳送門
【題目描述】
原題來自: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...