POJ - 2352 Stars (树状数组 入门题)

本文介绍了一种使用树状数组(Binary Indexed Tree)来高效解决特定星星等级问题的方法。该问题要求根据星星的坐标计算其等级,即在左下方的星星数量,并输出各等级星星的数量分布。文章详细解释了树状数组的实现原理和具体应用,包括如何通过树状数组进行累加求和和更新操作,从而快速统计星星等级。

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

题目大意:

       给你星星的坐标(y递增,若y相等,x递增),每个星星都有一个等级,规定它的等级就是在它左下方的星星的个数。输入所有星星后,依次输出等级为0到n-1的星星的个数。

解题思路:

       统计x前面比它小的星星的个数。注意的是:给的点的坐标是从0开始的,树状数组下标为0的位置不可用,所以我们需要在输入x坐标时+1。

       因为本题给出的数据就是已经按照y从小到大排好序的,也就是说,当前读到一个点的时候,当前点的y坐标肯定比已经读入的大,或者等于。就算是等于的话,也是x坐标比我当前点的x坐标小,所以我们每次只要算x坐标比我们小的就行了 。 

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 32010
int ans[maxn];
int n;
int c[maxn];
int lowbit(int x)
{
    return x & -x;
}
void add(int i,int val)// Add操作,将第i个元素增加val,那么他的父节点也要增加+
{
    while(i<=maxn)
    {
        c[i]+=val;
        i+=lowbit(i);//i的父节点
    }
}
int sum(int i)
{
    int s=0;
    while(i>0)
    {
        s+=c[i];
        i-=lowbit(i);//I的前驱
    }
    return s;
}
int main()
{
    scanf("%d",&n);
    int x,y;
    for(int i=1;i<=n;++i)
    {
        scanf("%d%d",&x,&y);
        x+=1;
        ans[sum(x)]++;
        add(x,1);
    }
    for(int i=0;i<n;++i)
        printf("%d\n",ans[i]);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值