LeeBlog

导航

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;
}

posted on 2011-04-07 21:18  LeeBlog  阅读(264)  评论(0编辑  收藏  举报