树状数组简单题(POJ2352,HDU1541)
2012-03-11 10:10
302 查看
POJ2352,HDU1541 Stars
给出N个点的X,Y坐标(按照Y升序,X升序的顺序给出),对于每个点输出有多少个点在该点的左下方。如图中的点5就有3个(1,2,4)点在它的左下方。
由于题目给出的数据已经是排好序的了,按照这个序列,一个点的左下方的点一定在它的前面出现。所以问题就转化成询问该点之前的所有点中有多少个点的X坐标小于等于该点X坐标。
所以只要先查询比X坐标小的点的个数记录到数组中,然后更新。
给出N个点的X,Y坐标(按照Y升序,X升序的顺序给出),对于每个点输出有多少个点在该点的左下方。如图中的点5就有3个(1,2,4)点在它的左下方。
由于题目给出的数据已经是排好序的了,按照这个序列,一个点的左下方的点一定在它的前面出现。所以问题就转化成询问该点之前的所有点中有多少个点的X坐标小于等于该点X坐标。
所以只要先查询比X坐标小的点的个数记录到数组中,然后更新。
#include <stdio.h> #include <memory.h> #define N 15004 #define M 32004 #define lowbit(x) ((x)&(-x)) int a ,c[M]; void update(int p) { while(p<M){ c[p]++; p+=lowbit(p); } } int sum(int p) { int ans=0; while(p) { ans+=c[p]; p-=lowbit(p); } return ans; } int main() { int n,i,x,y; while(scanf("%d",&n)!=EOF) { memset(c,0,sizeof(c)); memset(a,0,sizeof(a)); for(i=0;i<n;i++) { scanf("%d%d",&x,&y); x++; a[sum(x)]++; update(x); } for(i=0;i<n;i++) printf("%d\n",a[i]); } return 0; }
相关文章推荐
- 简单树状数组-poj2352
- ACM-树状数组之Stars——hdu1541,poj2352
- POJ2352 简单树状数组 附加输入挂
- POJ1195 Mobile phones(简单二维树状数组)
- 树状数组-HDU1541-Stars一维树状数组 POJ1195-Mobile phones-二维树状数组
- 树状数组模板及poj几道简单题
- HDU1541 Stars【树状数组】
- HDU1541 Stars (树状数组)
- POJ2352 Stars 【树状数组】or【线段树】
- POJ2352 stars(树状数组)
- hdu1541 Stars (树状数组)
- ACM集训——POJ2352---一维树状数组的应用
- 【XSY2669】归并排序 树状数组 简单组合数学
- 【树状数组--单点更新区间求和】 hdu1541 Stars
- poj 2352(简单树状数组)
- POJ2352 Stars 树状数组 + 裸
- hdu1541,坑爹的经典树状数组
- Hdu1166 step5.3.2敌兵布阵(简单的树状数组)
- 树状数组简单题----杭电1541
- POJ 2352 Stars(简单树状数组)