题目链接: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; }
HDU 1541 Stars(树状数组),布布扣,bubuko.com
原文地址:http://blog.csdn.net/mullerwch/article/details/38683947