题目链接
天文学家经常研究星图,星图上的星星由平面上的点表示,每颗星星都有笛卡尔坐标。一颗星星的等级是指该星星左下方的星星的数量.
例如,查看上图所示的地图,5号星的等级为3(左下方有1、2、4号星),2号星和4号星的等级为1。在这张地图上有一颗0级的星星,两颗1级的星星,一颗2级的星星,和一颗3级的星星。
你需要写一个程序来计算给定星图上每个等级的星星数量
Input
输入的第一行包括了星星的数量N (1<=N<=15000),下面N行描述了每颗星星的坐标(每一行由一个空格分隔两个整数X和Y组成, 0<=X,Y<=32000)。每一个点只会存在一颗星星。星星以Y坐标的升序排列。Y坐标相等的恒星按X坐标的升序排列。
Output
输出应该包括N行,每行一个数字。第一行为等级是0级的星星数量,第二行为等级是1级的星星数量,以此类推,最后一行为等级是N-1级的星星数量。
Sample Input
5
1 1
5 1
7 1
3 3
5 5
Sample Output
1
2
1
1
0
//树状数组
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define MAX 500010
#define ll long long
int c[MAX];
int num[MAX];
int n;
int lowbit(int x)//
{
return x&(-x);
}
//void update(int x,int val)//修改
//{
// while(x<=n){
// c[x]+=val;
// x+=lowbit(x);
// }
//}
//update(a[i],1);
void update(int x)
{
while(x<=MAX)
{
c[x]++;//val变为1;
x+=lowbit(x);
}
}
void update(int x)//修改
{
for(int j=x; j<=; j+=lowbit(j))
{
c[j]++;
}
}
int sum(int k)//求和
{
int ans=0;
for(int i=k; i>0; i-=lowbit(i))
{
ans+=c[i];
}
return ans;
}
int sum(int x)//节点 求值
{
int s=0;
while(x)
{
s+=c[x];
x-=lowbit(x);
}
return s;
}
bool cmp(node a,node b){//排序
return a.val<b.val;
}
int main()
{
while(scanf("%d",&n)==1&&n)
{
int x,y;
memset(c,0,sizeof(c));
memset(num,0,sizeof(num));
for(int i=1; i<=n; i++)
{
scanf("%d%d",&x,&y);
x++;//
num[sum(x)]++;
update(x);
}
for(int i=0; i<n; i++)
printf("%d\n",num[i]);
}
return 0;
}