题意:求坐标0到x间的点的个数

思路:树状数组,主要是转化,根据题意的输入顺序,保证了等级的升序,可以直接求出和即当前等级的点的个数,然后在把这个点加入即可。

注意:树状数组下标从1开始(下标为0的话会出错),所以把所有的x加1存储。

#include

#include

#include

using namespace std;

#define MAXN 32005

#define MAXL 15005

int c[MAXN];

int lev[MAXL];

int lowbit(int i){

return i&-i;

}

void update(int i,int val){//更新函数

while(i<=MAXN){

c[i]+=val;

i+=lowbit(i);

}

}

int sum(int i){//求和函数

int sum=0;

while(i>0){

sum+=c[i];

i-=lowbit(i);

}

return sum;

}

int main(){

int n,x,y,i;

while(~scanf("%d",&n)){

memset(c,0,sizeof(c));

memset(lev,0,sizeof(lev));

for(i=0;i

scanf("%d%d",&x,&y);

++x;//树状数组从1开始,为0的话会出错

++lev[sum(x)];//先求和

update(x,1);//后加1

}

for(i=0;i

printf("%d\n",lev[i]);

}

return 0;

}

View Code

 

参考链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。