1. 程式人生 > 其它 >數星星

數星星

技術標籤:天梯賽c++

星圖是一種在平面上表示恆星位置的地圖,每顆恆星都有它的笛卡爾座標,我們定義恆星的等級為不高於它的恆星的數量,也就是不比它高且不在它右邊的恆星數量。我們現在想知道恆星的等級情況。
在這裡插入圖片描述
例如,上圖中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; }