1028.星星
时间限制:0.25秒
内存限制:64 MB
Descripsion:
天文学家经常检查恒星图,其中恒星由平面上的点表示,每个恒星都有笛卡尔坐标。令一颗恒星的数量等于不高于该恒星且不在给定恒星右边的恒星数量。天文学家想知道恒星的水平分布。
问题图
例如,查看上图所示的地图。5号星的等级等于3(由三颗分别为1、2和4的星组成)。编号为2和4的恒星的级别为1。在此地图上,只有0级的一颗星,1级的两颗星,2级的一颗星和3级的一颗星。
您将要编写一个程序,该程序将计算给定地图上每个级别的星星数量。
输入项
输入的第一行包含许多分Ñ(1≤ Ñ ≤15000)。下面Ñ行描述分坐标(两个整数X和ÿ每行分离由一个空间,0≤ X,ÿ ≤32000)。在飞机的某一点上只能有一颗星星。星按Y坐标的升序列出。Y坐标相等的星按X坐标的升序排列。
输出量
输出应包含N行,每行一个。第一行包含级别0的恒星数量,第二行包含级别1的恒星数量,依此类推,最后一行包含级别N -1 的恒星数量。
样品
输入
5
1 1
5 1
7 1
3 3
5 5
输出
1
2
1
1
0
分析:
这道题即是树状数组的模板题 直接打一个函数查询树状数组前缀和
最后在 a n s ans ans数组里统计就可以了
CODE:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,x,y,c[100005],ans[100005];
int lowbit(int x)
{
return x&(-x);
}
int find(int x)
{
int ans=0;
for(;x;x-=lowbit(x)) //查询前缀和
ans+=c[x];
return ans;
}
void ques(int x)
{
for(;x<=32001;x+=lowbit(x)) //下一位
c[x]++;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
x++;
ans[find(x)]++; //统计
ques(x);
}
for(int i=0;i<n;i++)
printf("%d\n",ans[i]);
return 0;
}