您的位置:首页 > 其它

POJ 2352 stars

2014-12-03 23:50 225 查看
树状数组,给的数据已按以Y为主序,x为次序排列,因此只需要按所给顺序,统计其前面有几个x小于等于其本身,该值就是该点的阶数

#include <cstdio>
#include <cstring>

int c[32005],num[15005];

int lowbit(int x){
return x&(-x);
}

int getSum(int x){
int  ret=0;
while(x>0){
ret+=c[x];
x-=lowbit(x);
}
return ret;
}
void upDate(int x){
while(x<=32001){
++c[x];
x+=lowbit(x);
}
}

int main(){
int n,x,y;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d",&x,&y);
++num[getSum(++x)];
upDate(x);
}
for(int i=0;i<n;i++)
printf("%d\n",num[i]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: