本文主要是介绍HDU1541 Stars【树状数组】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接:
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【树状数组】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!