HDU 3193 Find the hotel (RMQ)

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



你可能感兴趣的:(HDU 3193 Find the hotel (RMQ))