给定N个hotel有2个属性(价钱,距离)【0,10000】
求f(hotel) = 1 , 的hotel个数。
f(hotel_x) = 1 表示: 没有一个hotel_y的价钱与距离同时严格小与hotel_x的价钱与距离。
注意: 价钱可以为0 。
dist[i] : 价钱为i的hotel最小的距离。
那么对当前hotel_x , 如果有hotel_y价钱在【0,hote_x.price)这个区间内且存在一个距离< hotel_x.dist 。那么f(hotel_x) = 0 。
也就是要快速的求价钱在【0,hotel_x.price) 内 dist值的最小值。
const int Max_N = 10008 ;
const int inf = 10005 ;
struct Hotel{
int price ;
int dist ;
Hotel(){}
Hotel(int p , int d):price(p),dist(d){}
friend bool operator < (const Hotel &A , const Hotel &B){
if(A.price == B.price)
return A.dist < B.dist ;
else
return A.price < B.price ;
}
};
Hotel hotel[Max_N] ;
int dist[Max_N+10] ;
int dp[Max_N+1][15] ;
int n ;
void RMQ_INIT(){
for(int i = 1 ; i <= Max_N ; i++)
dp[i][0] = dist[i] ;
for(int j = 1 ; (1<<j) <= Max_N ; j++)
for(int i = 1 ; i+(1<<(j-1)) <= Max_N ; i++)
dp[i][j] = min(dp[i][j-1] , dp[i+(1<<(j-1))][j-1]) ;
}
int RMQ(int L , int R){
int k = 0 ;
while((1<<(k+1)) <= R-L+1)
k++ ;
return min(dp[L][k] , dp[R-(1<<k)+1][k]) ;
}
void Ans(){
int i , price , dis , min_dis ;
vector<Hotel> ans ;
vector<Hotel> ::iterator it ;
RMQ_INIT() ;
for(i = 1 ; i <= n ; i++){
price = hotel[i].price ;
dis = hotel[i].dist ;
if(price == 0){
ans.push_back(hotel[i]) ;
continue ;
}
min_dis = RMQ(1 , price) ;
if(min_dis < dis)
continue ;
ans.push_back(hotel[i]) ;
}
sort(ans.begin() , ans.end()) ;
printf("%d\n" , ans.size()) ;
for(it = ans.begin() ; it != ans.end() ; it++){
printf("%d %d\n" ,it->price , it->dist) ;
}
return ;
}
int main(){
int i , price , dis ;
while(scanf("%d" ,&n) != EOF){
fill(dist , dist+Max_N+5 , inf) ;
for(i = 1 ; i <= n ; i++){
scanf("%d%d" , &price , &dis) ;
hotel[i] = Hotel(price , dis) ;
dist[price+1] = min(dist[price+1] , dis) ;
}
Ans() ;
}
return 0 ;
}