數星星
阿新 • • 發佈:2020-12-30
星圖是一種在平面上表示恆星位置的地圖,每顆恆星都有它的笛卡爾座標,我們定義恆星的等級為不高於它的恆星的數量,也就是不比它高且不在它右邊的恆星數量。我們現在想知道恆星的等級情況。
例如,上圖中1號恆星的等級為3(不比它高且不在它右邊的恆星是2、3、4號恆星),2號和4號恆星的等級為1,5號恆星等級為2,3號恆星等級為0。
輸入格式:
第一行輸入一個整數N(i≤N≤15000)。隨後的N行,每行有兩個整數X和Y(0≤X,Y≤32000),分別為恆星的座標。一個座標點上只有一顆恆星,且恆星按Y座標升序排列,如果Y座標相等則X座標升序排列。
輸出格式:
輸出有N行,每行有一個整數。第1行整數是等級為0的恆星數量,第2行是等級為1的恆星數量,以此類推,最後一行為等級為N−1的恆星數量.
輸入樣例:
在這裡給出一組輸入。例如:
5
1 1
5 1
7 1
3 3
5 5
輸出樣例:
在這裡給出相應的輸出。例如:
1
2
1
1
0
#include <iostream>
#include <algorithm>
#include <cstdio>
#define lowbit(i) (i&(-i))
using namespace std;
const int maxn = 32000+5;
int c[maxn],ans[maxn];
void add_n(int m,int n)
{
for(int i=m;i<=maxn; i+=lowbit(i))
c[i]+=n;
}
int get_sum(int m)
{
int s=0;
for(int i=m;i;i-=lowbit(i))
s+=c[i];
return s;
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int x,y;
scanf("%d %d",&x,&y);
ans[get_sum(x+1)]++;
add_n((x+1),1);
}
for(int i=0;i<n;i++)
cout<<ans[i]<<endl;
return 0;
}