首页 > 代码库 > HDU 1541 Stars(树状数组)
HDU 1541 Stars(树状数组)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1541
解析:
题意:大概就是计算每颗星星左下边包括了多少颗星星,这个数值就是level。左下边不包括本身,不超过本身的x,y的坐标,可以等于。问每种level有多少颗星星。
这题,一开始想不到怎么用到树状数组,后来看了一下,发现题目给的数据是已经按x,y排好序的,所以我们可以不用管y的值。
注意:
1.每次输入一个坐标对之后,都要计算一下这个它的level。
2.此题的x坐标可以为0,而树状数组是从1开始的,所以处理的时候对每个x坐标进行加一即可。输出从level=0,开始。
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <vector> using namespace std; const int MAXN=32005; #define Lowbit(x) ((x)&(-(x))) int a[MAXN], c[MAXN]; void ADD(int p, int val){ while(p<MAXN){ c[p]+=val; p+=Lowbit(p); } } int getsum(int p){ int sum = 0; while(p>0){ sum += c[p]; p-=Lowbit(p); } return sum; } int main(){ int N; while(~scanf("%d", &N)){ int i,x,y; memset(a, 0, sizeof(a)); memset(c, 0, sizeof(c)); for(i=0; i<N; ++i){ scanf("%d%d", &x, &y); a[getsum(x+1)]++; ADD(x+1, 1); } for(i=0; i<N; ++i){ printf("%d\n", a[i]); } } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。