HDU 1541 Stars -(树状数组)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41181771/article/details/84140498

题目链接:HDU-1541

Problem Description

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.

Input

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.

Output

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.

Sample Input

5

1 1

5 1

7 1

3 3

5 5

Sample Output

1

2

1

1

0

题意描述:

题意就是给你无数个星星,让你把它们之中不同等级给划分开来,然后输出各个等级的数量;等级划分的规则是,一个星星的左下方有多少个星星(不包含他自己),所以输出的时候,从0开始输出;因为题上给的坐标就是按 x 升序给出的(x 相等的话,按 y 升序给出),所以等级直接就可以算出,也就是它前面的星星的数量。

本题更新的时候,更新的 value 1,所以可以不用传变量,直接更新对应节点即可;

void update(int a) //老规矩,更新它和它的父节点
{
    for(int i=a; i<=N; i+=lowbit[i])
        build[i] += 1;
}

代码篇:

#include <iostream>
#include <cstdio>
#include <cstring>
#define N 32009
using namespace std;
int build[32010],lowbit[32010],num[32010],n;

void update(int a) //老规矩,更新它和它的父节点
{
    for(int i=a; i<=N; i+=lowbit[i])
        build[i] += 1;
}

void getlow() //lowbit数组
{
    for(int i=1; i<=N; i++)
        lowbit[i] = i & -i;
}

int sum(int a) //计算它和它的子节点,一直到0
{
    int ans=0;
    for(int i=a; i>=1; i-=lowbit[i])
        ans += build[i];
    return ans;
}
int main()
{
    int x,y;
    getlow();
    while(~scanf("%d",&n))
    {
        memset(build,0,sizeof(build)); // 每次用完都要清一下数组,不然会WA
        memset(num,0,sizeof(num));
        for(int i=1; i<=n; i++)
        {
            scanf("%d %d",&x,&y);
            x++;
            num[sum(x)]++; //相应等级的数量增加
            update(x); //对应更新
        }
        for(int i=0; i<n; i++)
            printf("%d\n",num[i]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41181771/article/details/84140498