zoukankan      html  css  js  c++  java
  • POJ 2352 Stars(HDU 1541 Stars)

    Stars
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 41521   Accepted: 18100

    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

    Hint

    This problem has huge input data,use scanf() instead of cin to read data to avoid time limit exceed.

    Source

     
     
     
    解析:树状数组(单点更新,区间查询)。根据题意,点的坐标不会重复,且输入时按y从小到大排列,y相同则按x从小到大排列,可以得到结论:如果后面输入的点的横坐标大于或等于之前输入的点的横坐标,那么之前输入的点一定在后面的点的左下角或正下方或正左方。据此可以建立一个树状数组来解答,假设原数组为a[],a[i]表示横坐标为i的点的个数,树状数组为c[],每输入一个点(x, y),查询从a[1]到a[x]的和,即可得到有多少个点的横坐标不大于这个点的横坐标,用ans[]来存储得到的和。每得到一个和,在ans[]的对应位置处加上1。处理完毕后输出即可。但要注意,题目中x的范围为[0, 32000],而树状数组的索引是从1开始的,因此把所有的x加上1,索引区间变为[1, 32001](如果从0开始的话,当i == 0时,执行add(i, 1)会陷入死循环,所以索引是从1开始的。树状数组的结构决定了它的性质)
     
     
     
    #include <cstdio>
    #include <cstring>
    #define lowbit(x) (x)&(-x)
    
    int c[32005];   //树状数组
    int ans[15005]; //存储结果
    
    void add(int i)
    {
        while(i <= 32001){  //注意为32001,而不是32000
            ++c[i];
            i += lowbit(i);
        }
    }
    
    int sum(int i)
    {
        int ret = 0;
        while(i > 0){
            ret += c[i];
            i -= lowbit(i);
        }
        return ret;
    }
    
    int main()
    {
        int n;
        while(~scanf("%d", &n)){
            int x, y;
            //先将两个数组清零
            memset(c, 0, sizeof(c));
            memset(ans, 0, sizeof(ans));
            for(int i = 1; i <= n; ++i){
                scanf("%d%d", &x, &y);
                ++x;    //索引加1
                ++ans[sum(x)];  //ans[]的对应处加上1
                add(x);  //增加一个横坐标为x的点
            }
            for(int i = 0; i < n; ++i)
                printf("%d
    ", ans[i]);
        }
        return 0;
    }
    
  • 相关阅读:
    十度好友问题
    TCP传输连接建立与释放详解
    Android多点触控技术实战,自由地对图片进行缩放和移动
    如何判断一个变量是数组Array类型
    HDU 4725 The Shortest Path in Nya Graph-【SPFA最短路】
    解决外贸电商难题,PayPal中国外贸电商大会圆满礼成
    动物-蛇:家蛇
    动物-蛇:水蛇
    动物-鱼:河蟹
    动物-鱼:河虾
  • 原文地址:https://www.cnblogs.com/inmoonlight/p/5720967.html
Copyright © 2011-2022 走看看