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