HDU_1541_Stars
首先,我们可以把树状数组的横坐标x看作c[i]数组的下标i,由于y是递增的,所以如果有两个数的横坐标相同,则...
#include<iostream> #include<string.h> #define MARK 32005 int c[MARK],lev[MARK]; int sum(int x) //计算最大下标为x的前缀和 { int ret=0; while(x>0) { ret+=c[x];x-=(x&-x); } return ret; } void add(int x) //下标x的数增加d,对应的c数组也会有变化 { while(x<MARK) { c[x]++;x+=(x&-x); } } int main() { int n,i,j,k,x,y; while(~scanf("%d",&n)) { memset(c,0,sizeof(c)); memset(lev,0,sizeof(lev)); for(i=0;i<n;++i) { scanf("%d%d",&x,&y); lev[sum(x+1)]++; //由于是求左子树(不包含自身),所以先sum add(x+1); //树状数组下标从1开始 } for(i=0;i<n;++i) printf("%d\n",lev[i]); } return 0; }