hdu1541
http://acm.hdu.edu.cn/showproblem.php?pid=1541
题意:给定一些点,求在这点左下方的点的个数;
思路:此题可以用二维树状数组做,但仔细看题,可以得到给出的y是从小到大的,这样,只需对x进行操作,进而转换为在x左边的点有多少个
代码:
#include<iostream> using namespace std; int a[32005],c[32005],n=32005; int lowbit(int x) { return x&(-x); } int sum(int x) { int sum=0; while(x>0) { sum+=c[x]; x-=lowbit(x); } return sum; } void inster(int x) { while(x<=n) { c[x]+=1; x+=lowbit(x); } } int main() { int x,y,i,m; while(scanf("%d",&m)>0) { memset(a,0,sizeof(a)); memset(c,0,sizeof(c)); for(i=0;i<m;i++) { scanf("%d%d",&x,&y); x++; //防止x为0,陷入死循环 a[sum(x)]++; inster(x); } for(i=0;i<m;i++) printf("%d\n",a[i]); } return 0; }
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。