
5 1 1 5 1 7 1 3 3 5 5
1 2 1 1 0
题目:
HDOJ: http://acm.hdu.edu.cn/showproblem.php?pid=1541
POJ: http://poj.org/problem?id=2352
又是一道树状数组,要注意题目求的是 每个等级星星的个数。
并不是第i个星星的等级。
等级判别:只要该星星左下方(包括正下方和正左方,不包括自己)有几个星星,等级就是几。
用树状数组的原理,三个函数一上,就出来了。
因为坐标是从0开始,所以相应的坐标要+1操作,否则会崩溃的。
/*******************************************
********************************************
* Author:Tree *
* From : blog.csdn.net/lttree *
* Title : Stars *
* Source: hdu 1541 *
* Hint : 树状数组 *
********************************************
********************************************/
#include <stdio.h>
#include <string.h>
#define RANGE 32005
// star存等级数,c存星星
int c[RANGE],star[15001];
int lowbit( int x )
{
return x&(-x);
}
void add( int i )
{
while( i<=RANGE )
{
++c[i];
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,i,x,y;
while( ~scanf("%d",&n) )
{
memset(star,0,sizeof(star));
memset(c,0,sizeof(c));
for ( i=0;i<n;i++ )
{
scanf("%d%d",&x,&y);
// 坐标是从0开始的,所以x+1
star[sum(x+1)]++;
// 后执行add函数,否则会把当前的星星算进去
add(x+1);
}
for( i=0;i<n;i++ )
printf("%d\n",star[i]);
}
return 0;
}
ACM-树状数组之Stars——hdu1541,poj2352,布布扣,bubuko.com
ACM-树状数组之Stars——hdu1541,poj2352
原文:http://blog.csdn.net/lttree/article/details/28616789