题意: 二维坐标平面上有一些星(*) ,问每个星左下方有多少个星
解析: 树状数组的另一类用法,不过由于题目保证星的输入顺序是已排列好的,使难度降低到了模版题一般
代码:
#include <stdio.h>
#include <string.h>
#define MAXN 20000
int C[MAXN*2];
int ans[MAXN]; //a[i]表示在第i个星左下放的星的数量
int n;
void UpDate(int x,int v){
while(x < 2* MAXN){
C[x] += v;
x += x&(-x);
}
}
int GetSum(int x){
int sum = 0;
while(x > 0){
sum += C[x];
x -= x&(-x);
}
return sum;
}
int main(){
int i;
while(scanf("%d",&n) != EOF){
memset(ans,0,sizeof(ans));
memset(C,0,sizeof(C));
for(i = 1;i <= n;i ++){
int a,b;
scanf("%d%d",&a,&b);
ans[GetSum(a + 1)] ++;
UpDate(a + 1,1);
}
for(i = 0;i < n;i ++){
printf("%d\n",ans[i]);
}
}
return 0;
}