标签:
题目链接:
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; }
标签:
原文地址:http://blog.csdn.net/lianai911/article/details/45691827