您的位置:首页 > 其它

HDU 1541 Stars 树状数组

2016-02-05 11:05 711 查看
[align=left]Problem Description[/align]
Astronomers often examine star maps where stars are represented by points on a plane and each star has Cartesian coordinates. Let the level of a star be an amount of the stars that are not higher and not to the right of the given star. Astronomers want to know the distribution of the levels of the stars.



For example, look at the map shown on the
figure above. Level of the star number 5 is equal to 3 (it's formed by three
stars with a numbers 1, 2 and 4). And the levels of the stars numbered by 2 and
4 are 1. At this map there are only one star of the level 0, two stars of the
level 1, one star of the level 2, and one star of the level 3.
You are
to write a program that will count the amounts of the stars of each level on a
given map.

[align=left]Input[/align]
The first line of the input file contains a number of
stars N (1<=N<=15000). The following N lines describe coordinates of stars
(two integers X and Y per line separated by a space, 0<=X,Y<=32000). There
can be only one star at one point of the plane. Stars are listed in ascending
order of Y coordinate. Stars with equal Y coordinates are listed in ascending
order of X coordinate.

[align=left]Output[/align]
The output should contain N lines, one number per line.
The first line contains amount of stars of the level 0, the second does amount
of stars of the level 1 and so on, the last line contains amount of stars of the
level N-1.

[align=left]Sample Input[/align]

5
1 1
5 1
7 1
3 3

5 5

[align=left]Sample Output[/align]

1

2

1

1

0

一道简单的树状数组,题目就是定义了一个等级制度,一个星星的等级等于在他左边或下面的星星数,然后按等级输出星星个数。
题目已经排好序,不然加个快排也是很快的。
既然已经有序,那么后面相同X的星星一定比前面的星星高,添加的时候等级就是1~x的星星总数了。
有多组数据!!!!!
为此我WA了3次。。。。
代码如下:

#include<iostream>
using namespace std;
int a[32005],c[32005],n=32005;
int lowbit(int x)
{
return x&(-x);
}
int sum(int i)
{
int sum=0;
while(i>0)
{
sum+=c[i];
i-=lowbit(i);
}
return sum;
}
void inster(int y,int x)
{
while(y<=n)
{
c[y]+=x;
y+=lowbit(y);
}
}
int main()
{
int x,y,i,j,n;
while(scanf("%d",&n)>0)
{
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
for(i=0;i<p;i++)
{
scanf("%d%d",&x,&y);
x++;
a[sum(x)]++;
inster(x,1);
}
for(i=0;i<p;i++)
printf("%d\n",a[i]);

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: