poj_2352 Stars (树状数组)

本文介绍了一种使用树状数组解决特定坐标系统中星星级别的算法问题。问题要求根据Y优先X次优先的坐标顺序,计算每个星星的级别,并统计各级别星星的数量。文章通过逐层将星星坐标加入树状数组并计算累积和的方法实现了这一目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://poj.org/problem?id=2352

题意:

给你一些星星的坐标,按Y优先X次优先的顺序给的,定义每个星星(Xi,Yi)的级别为<xi&&<yi的星星个数。求每个级别有多少星星
思路:

因为坐标是按y顺序给出的,所以一层层的按顺序加到树状数组中,每加一次求一次Sum,即为该点的级别值。 

我的代码:

#include<stdio.h>
#define lowbit(i) (i)&(-i)
int c[32005],i,x,y,n,ans[15005];
void Add(int i,int val,int n)
{
    for(;i<=n;i+=lowbit(i)) c[i]+=val;
}
int Sum(int i)
{
    int ret=0;
    for(;i>0;i-=lowbit(i)) ret+=c[i];
    return ret; 
}
int main()
{
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d%d",&x,&y);
        ans[Sum(x+1)]++;
        Add(x+1,1,32001);//要更新到32001,因为X+1了 
    }
    for(i=0;i<n;i++)
        printf("%d\n",ans[i]);
    return 0;
}
/*第一次写数状数组啊,开始更新那里错了,WA^n。。。 */ 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值