这题想得复杂了,其实只需要用一次排序就OK,我居然有树状数组+离散化了,太傻叉了。。。 可是,还是过了,好吧,等下贴上简单AC的代码 #include <cstdio> #include <algorithm> #include <cstring> using namespace std; typedef struct _Node { int x,y; }Node; typedef struct _Node2 { int original , actual; }Node2; const int MAX = 50010; Node data[MAX]; Node2 hash[MAX]; int tree[MAX]; int n , treen; bool cmp1( const Node& left , const Node& right ) { if( left.x != right.x ) return left.x > right.x ; else return left.y > right.y; } bool cmp2( const Node& left , const Node& right ) { return left.y < right.y; } int getlowbit( int x ) { return x & ( -x ); } void setbit( int place , int key ) { for( ; place >= 1 ; place -= getlowbit( place ) ) tree[ place ] += key; } int getsum( int place ) { int sum = 0 ; for( ; place < treen ; place += getlowbit( place ) ) sum += tree[ place ]; return sum; } int binarysearch( int left , int right , int key ) { int middle; while( left <= right ) { middle = ( left + right )/2; if( hash[middle].original == key ) return middle; else if( hash[middle].original < key ) left = middle + 1; else right = middle - 1; } return -1; } void sethash() { sort( &data[0] , &data[n] , cmp2 ); int begin = 0 ; int k = 1 ; for( int i = 0 ; i != n ; ++i ) if( data[i].y != data[begin].y ) { hash[k].original = data[begin].y; hash[k].actual = k ; ++k; begin = i ; } hash[ k ].original = data[ begin ].y; hash[ k ].actual = k ; ++k ; treen = k; } int find() { int sum = 0 ; memset( tree , 0 , sizeof( tree ) ); sort( &data[0] , &data[n] , cmp1 ); for( int i = 0 ; i != n ; ++i ) { int place = binarysearch( 1 , treen - 1 , data[i].y ); if( getsum( hash[place].actual ) == 0 ) ++sum; setbit( hash[place].actual , 1 ); } return sum; } int main() { while( scanf("%d",&n) , n != 0 ) { for( int i = 0 ; i != n ; ++i ) scanf("%d%d",&data[i].x , &data[i].y ); sethash(); printf("%d/n",find()); } } 下面是简单代码 #include <cstdio> #include <algorithm> using namespace std; const int MAX = 50010; typedef struct _Node { int x,y; }Node; Node data[MAX]; Node hash[MAX]; int n ,hashn; bool cmp( const Node & left , const Node & right ) { if( left.x != right.x ) return left.x > right.x ; else return left.y > right.y ; } void sethash() { sort( &data[0] , &data[n] , cmp ); int begin = 0 ; hashn = 0 ; for( int i = 0 ; i != n ; ++i ) if( data[i].x != data[begin].x ) { hash[ hashn ] = data[ begin ]; ++hashn ;begin = i; } hash[ hashn ] = data[ begin ]; ++hashn; } int find() { int max = hash[0].y; int sum = 1; for( int i = 1 ; i < hashn ; ++i ) if( hash[i].y > max ) { ++sum; max = hash[i].y; } return sum; } int main() { while( scanf("%d",&n) , n != 0 ) { for( int i = 0 ; i != n ; ++i ) scanf("%d%d",&data[i].x ,&data[i].y); sethash(); printf("%d/n",find()); } }