HDU 3193 Find the hotel (RMQ)

来源:互联网 发布:nginx addmodule 编辑:程序博客网 时间:2024/05/01 07:49

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



0 0
原创粉丝点击