HDU1541 Stars (树状数组)

来源:互联网 发布:php调用api接口教程 编辑:程序博客网 时间:2024/05/24 16:14

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1541

题目大意:一开始有n个星星,计算第i颗星星的左下方有多少颗星星(不包括本身)。

思路:其实这个题目乍一看的话并没有想到怎么用树状数组。仔细看了看,发现y是按照递增的顺序输入的,也就是可以按照x的坐标求(画图分析下事例就明白了)。要注意下这道题目坐标是从0开始的,而树状数组不能求坐标为0的坐标,所以在求的时候要x+1.

AC代码如下:

#include <cstdio>#include <cstring>using namespace std;int tree[32005],a[15005];int n,x,y;int lowbit(int k){return k & -k;}void add(int k, int num){while(k <= 32000){tree[k] += num;k += lowbit(k);}}int read(int k){int sum = 0;while(k){sum += tree[k];k -= lowbit(k);}return sum;}int main(){while(~scanf("%d",&n)){memset(tree,0,sizeof(tree));memset(a,0,sizeof(a));for(int i = 0; i < n; i ++){scanf("%d%d",&x,&y);a[read(++ x)] ++;//先计算,再修改,因为不包括本身 add(x,1);} for(int i = 0; i < n; i ++){printf("%d\n",a[i]);}}return 0;}


原创粉丝点击