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