码迷,mamicode.com
首页 > 编程语言 > 详细

HDU1541 Stars【树状数组】

时间:2015-05-13 14:49:00      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1541


题目大意:

按顺序给你N颗星星的坐标,y是从小到大给出的。每个星星有一个等级,该等级为它左下角的星星

的个数。求每个等级的点有多少个。


思路:

因为y是从小到大给出的,那么可以直接忽略y,只记录x,求出(x,y)左边有多少个点就可以了。

用Ans[]数组表示每个等级的星星数。求(x,y)左边有多少个点用树状数组来做,每给一个点,就求出

x左边的点个数。作为Ans数组下标,累加个数,最后输出Ans[]数组。


AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

int Tree[32200],Ans[32200],N = 32200;
int Lowbit(int x)
{
    return x & (-x);
}

int Update(int i,int x)
{
    while(i <= N)
    {
        Tree[i] = Tree[i] + x;
        i += Lowbit(i);
    }
}

int Query(int n)
{
    int sum = 0;
    while(n > 0)
    {
        sum += Tree[n];
        n -= Lowbit(n);
    }
    return sum;
}

int main()
{
    int x,y,M;
    while(cin >> M)
    {
        memset(Tree,0,sizeof(Tree));
        memset(Ans,0,sizeof(Ans));
        for(int i = 0; i < M; ++i)
        {
            cin >> x >> y;
            x++;
            Ans[Query(x)]++;
            Update(x,1);
        }
        for(int i = 0; i < M; ++i)
            printf("%d\n",Ans[i]);
    }

    return 0;
}


HDU1541 Stars【树状数组】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/45691827

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!