//题意:统计每个给定点的左下方(包括正左和正下)的点的个数. #include<stdio.h> #include<string.h> #define max 32100 int ans[max],pox[max]; int lowBit(int n) { return n&(-n); } //如果是x-=x&(-x);就是得到x这个点的管辖区间的下个区间的管辖点; int getSum(int x) { int sum=0; while(x>0) { sum+=pox[x]; x-=lowBit(x); } return sum; } //如果是x+=x&(-x);就是得到的改点的父节点的值;比如x=4时;就能得到8; void upDate(int x) { while(x<max) { pox[x]++; x+=lowBit(x); } } int main() { int t; int x,y; while(scanf("%d",&t)!=EOF) { memset(ans,0,sizeof(ans)); memset(pox,0,sizeof(pox)); for(int i=0; i<t; i++) { scanf("%d%d",&x,&y); ans[getSum(x+1)]++; upDate(x+1); } for(int i=0; i<t; i++) printf("%d\n",ans[i]); } return 0; }