题意:给出N个星星的坐标,level[x]表示在当前节点左下方的星星的个数,然后让你输出level[0] . level[1] .....的值。星星的坐标按y的升序给出。
思路:简单线段树,每当给出一个坐标,在他所在区间就自加1,然后查到该节点,得出在左下方的星星数,就可以了。
看代码吧,
View Code
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> #include <queue> #include <math.h> #define N 32005 #define M 15005 using namespace std ; int p[8*N] , num[M] ; int n ; int find( int id , int pos , int ll , int rr ) { p[id]++ ; if ( pos == rr ) return p[id] - 1 ;//减去他自身 int mid = ( ll + rr ) / 2 ; if ( pos <= mid ) return find( 2*id , pos , ll , mid );//搜左子树 else return p[2*id] + find( 2*id+1 , pos , mid+1 , rr );//搜右子树,加上左子树的个数 } int main() { int i , x , y , k ; while( scanf( "%d" , &n ) != EOF ) { memset( num , 0 , sizeof( num )); memset( p , 0 , sizeof( p )); int maxx = N ; for ( i = 1 ; i <= n ; i++ ) { scanf( "%d%d" , &x , &y ); k = find( 1 , x , 0 , maxx ); //cout<<k<<endl; num[k]++ ; } //cout<<endl; for ( i = 0 ; i < n ; i++) { printf( "%d\n" , num[i] ); } } return 0 ; }