POJ-2352 Stars (树状数组)

POJ2352数星星(stars)

【题目描述】:

       天文学家经常观察星象图。星象图中用平面上的点来表示一颗星星,每一颗星星都有一个笛卡尔坐标。设定星星的等级为其左下角星星的总数。天文学家们想知道星星等级的分布情况。

 

       比如上图,5号星星的等级为3(其左下角有编号为1、2、4的星星共三颗)。2号星星和4号星星的等级为1。在上图中只有一颗星星等级为0,两颗星星等级为1,一颗星星等级为2,一颗星星等级为3。

       给定一个星象图,请你写一个程序计算各个等级的星星数目。

【输入描述】:

       输入的第一行包含星星的总数N (1<=N<=15000)。接下来N行,描述星星的坐标(X,Y)(X和Y用空格分开,0<=X,Y<=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

【数据范围及描述】:

 

 

此题一看以为是一道暴搜,但是暴搜会超时,思考了很长时间才发现一个很重要的条件没看到=_=  输入是按y轴升序输入的,也就是说后面的星星不可能被前面的星星包含,只需要考虑x轴。这样就把二维压成了一维,后面可以用树状数组解决。注意:x可能为0,但是树状数组是从1开始的所以每次操作时将x++;

 

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <queue>
 6 #include <stack>
 7 #include <vector>
 8 #include <iostream>
 9 #include "algorithm"
10 using namespace std;
11 typedef long long LL;
12 const int MAX=32005;
13 int n;
14 int c[MAX],ans[MAX];
15 void update(int x,int y){
16     for (;x<MAX;c[x]+=y,x+=(x&-x));
17 }
18 int search(int x){
19     int re;
20     for (re=0;x>0;re+=c[x],x-=(x&-x));
21     return re;
22 }
23 int main(){
24     freopen ("stars.in","r",stdin);
25     freopen ("stars.out","w",stdout);
26     int i,j,k;
27     int x,y;
28     scanf("%d",&n);
29     memset(c,0,sizeof(c));
30     memset(ans,0,sizeof(ans));
31     for (i=1;i<=n;i++)
32     {scanf("%d%d",&x,&y);
33      x++;
34      j=search(x);
35      ans[j]++;
36      update(x,1);
37     }
38     for (i=0;i<n;i++)
39      printf("%d\n",ans[i]);
40     return 0;
41 }

 

posted @ 2016-07-31 08:54  lonely_OIer  阅读(179)  评论(0编辑  收藏  举报