//
题意:给定一些点,求在这点左下方的点的个数;
思路:此题可以用二维树状数组做,但仔细看题,可以得到给出的y是从小到大的,这样,只需对x进行操作,进而转换为在x左边的点有多少个
AC代码:
#include<stdio.h> #include<string.h> #define N 32005 int a[N]; int b[N]; int n; int lower_bit(int i) { return i&(-i); } void add(int i,int v) { while(i<=N) { a[i]+=v; i+=lower_bit(i); } } int sum(int i) { int s=0; while(i>0) { s+=a[i]; i-=lower_bit(i); } return s; } int main() { while(scanf("%d",&n)!=EOF) { int i; int x,y; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); for(i=0;i<n;i++) { scanf("%d%d",&x,&y); x++; b[sum(x)]++; add(x,1); } for(i=0;i<n;i++) { printf("%d\n",b[i]); } } return 0; }