简单的树状数组题,题意:统计这个star左下角star的个数,
就是这个star的level。现在要你总计图中level从0到N-1的star
分别有多少个?因为数据是输入的坐标是按Y的升序、如果Y相等,
则按X的升序。所以我们发现我们可以完全忽略Y,只要统计小于
本身X的star个数,就是level了.
#include<stdio.h> #include<string.h> int c[32002],val[15011]; void update(int k,int dir)//改变第K项的值 { while(k<32002) { c[k]+=dir; k+=k&(-k);//从C[k]往根节点一路上溯 } } int sum(int k) { int sm=0; while(k>0) { sm=sm+c[k]; k-=k&(-k);//从C[k]往根节点一路下溯 } return sm; } int main() { int i,j,n,y; while(scanf("%d",&n)!=EOF) { memset(c,0,sizeof(c)); memset(val,0,sizeof(val)); for(i=1;i<=n;i++) { scanf("%d%d",&j,&y); j++;//树状数组是从1开始的,坐标可能为0; val[sum(j)]++; update(j,1); } for(i=0;i<n;i++) printf("%d\n",val[i]); } return 0; }