HDU1541 Stars【树状数组】

来源:互联网 发布:linux wifi局域网ip 编辑:程序博客网 时间:2024/05/16 23:57

题目链接:

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;}


0 0