HDU 1541 Stars
这题让我情何以堪啊,悲剧了以下午,居然是审题不仔细,我原以为是对应输出每个星星的等级,后来突然发现是求每个等级的星星数目;
这题是个树状数组的题,因为只要算左下角的星星数目( 包括正左,正下 ),而且给出数据的方式又是先按X轴排列,再按Y轴排列( 按这样的方式算出来的等级都不会变了,因为这样它的左下方不能再加星星了,这样就可以直接看它左下方的星星数目,即相应的等级),使得我们可以用树状数组来做,当到( a,b )点时,只要看小于a( a的左下方星星 )的数目就可以知道这个星星是多少等级了,然后再把这个等级的星星数目增加1这样就很轻松的算出结果了
#include<stdio.h>
#include<string.h>
#define lowbit(x) (x)&(-x)
int tree[35000],level[35000],n;
void plus( int x )
{
while( x <= 35000 )
{
++tree[x];
x += lowbit( x );
}
}
int sum( int x )
{
int sum = 0;
while( x > 0 )
{
sum += tree[x];
x -= lowbit( x );
}
return sum;
}
int main( )
{
while( scanf( "%d",&n ) != EOF )
{
memset(tree,0,sizeof(tree));
memset(level,0,sizeof(level));
for( int i = 0; i < n; ++i )
{
int x,y;
scanf( "%d%d",&x,&y );//因为坐标轴从0开始计算,而树状数组从1开始,所以x要++
level[sum( ++x )]++;//sum用来算星星等级的,level代表这个等级星星的数目
plus( x );//这里不能放在上一步的前面,否则会把当前星星算进去
}
for( int i = 0; i < n; ++i )
printf( "%d\n",level[i] );
}
return 0;
}
本人还是新手 ,转载请注明来自Lvsi‘s home
浙公网安备 33010602011771号