【Ural 1028】Stars【树状数组】

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;
}
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值