hdu1541&poj2352 Stars

.............................................................................................................................................................................................................................................................

[题目大意]
   
给定一个星座的直角坐标图,每个星星都有一个坐标值(x,y)(0<=X,Y<=32000);其中输入中的y是不下降的。给出N(1<=N<=15000)个星星
的坐标,输出等级分别为0,1,2 3,4,...的星星的个数。星星的等级的定义是:如果有m个星星的坐标(xy)均小于等于该星星的坐标(x0y0)则该星星的等级为m

Sample Input

1 1 
5 1 
7 1 
3 3 
5 5

Sample Output
1    (
等级为0的星星的个数)
2    (
等级为1的星星的个数)
1    (
等级为2的星星的个数)
1    (
等级为3的星星的个数)
0    (
等级为4的星星的个数)
[
题目详解]
用树状数组,不用管y坐标(因为已经是升序,后边的星星不影响前边星星的等级),用lev(n)来统计等级为n的星星个数,但是千万注意树状数组需要数组以1为首项,由于坐标有0,所以每次需要给x坐标+1


如图:

等级为0的星星的个数1    坐标(1,1)
等级为1的星星的个数2    坐标 (3,3),(5,1)
等级为2的星星的个数1    坐标 (7,1)
等级为3的星星的个数1    坐标 (5,5)
等级为4的星星的个数0    没有

在poj上wrong answer、Time Limit Exceeded、Output Limit Exceeded加一起10+了,整整一天看了好多人的代码和解题报告,一开始数组开的太小,树状数组是从1开始的,坐标上有0,必须+1。


.............................................................................................................................................................................................................................................................


代码:

#include<stdio.h>
#include<string.h>
#define MAX 32005    //题目是32000,不能小于32000
int tree[MAX],n;
int asn[MAX];

int lowbit(int idx)
{
    return idx&(-idx);
}

void update(int idx,int val)
{
    while(idx<=MAX)
    {
        tree[idx]+=val;
        idx+=lowbit(idx);
    }
}

int sum(int idx)
{
    int sum=0;
    while(idx>0)
    {
        sum+=tree[idx];
        idx-=lowbit(idx);
    }
    return sum;
}

int main()
{
   int t,x,y,i;
   while(scanf("%d",&n)!=EOF)
   {
       memset(tree,0,sizeof(tree));
       memset(asn,0,sizeof(asn));
       for(i=1;i<=n;i++)
       {
           scanf("%d %d",&x,&y);
           x=x+1;
           update(x,1);
           asn[sum(x)-1]++;
       }
       for(i=0;i<n;i++)
       {
           printf("%d\n",asn[i]);
       }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值