Untitled

 avatar
unknown
c_cpp
10 months ago
2.8 kB
17
Indexable
class MovieRentingSystem {
public:
    // Available movies 
    unordered_map<int,priority_queue< pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>>> 
    availableMovies;

    // Checking weather a particular movie on the rent or not 
    set<pair<int,int>> checkRented ; 
    
    // To fin price efficiently 
    unordered_map<int, unordered_map<int,int>> price;

    // heap to track prices 
    priority_queue< vector<int>, vector<vector<int>>, greater<vector<int>>> recentMovies ; 
    MovieRentingSystem(int n, vector<vector<int>>& entries) { 
        for(int i=0 ; i<entries.size();i++){
            int shop = entries[i][0] ; 
            int movie = entries[i][1] ; 
            int p = entries[i][2] ; 
            availableMovies[movie].push({p,shop}) ; 
            price[movie][shop]= p; 
        }
    }
    
    vector<int> search(int movie) {
        vector<int> ans ; 
        vector<pair<int,int>> rollback;
        int len =0 ; 
        while(!availableMovies[movie].empty() && len<5){
            int shop = availableMovies[movie].top().second ; 
            if(checkRented.find({shop,movie})==checkRented.end()){
                len++ ; 
                ans.push_back(shop) ; 
                rollback.push_back(availableMovies[movie].top()) ; 
            }
            availableMovies[movie].pop();
        }
        for (auto &p : rollback) availableMovies[movie].push(p);
        return ans ; 
    }
    
    void rent(int shop, int movie) {
        if(checkRented.find({shop,movie})==checkRented.end()){
                recentMovies.push({price[movie][shop], shop, movie}) ; 
                checkRented.insert({shop,movie}) ; 
        }
       
    }
    
    void drop(int shop, int movie) {
        checkRented.erase({shop,movie}) ; 
    }
    
    vector<vector<int>> report() {
        int len = 0 ; 
        vector<vector<int>> rollback; 
        vector<vector<int>> ans ; 
        while(!recentMovies.empty() && len<5){
            auto top = recentMovies.top() ; 
            int shop = top[1] ; 
            int movie = top[2] ; 
            int p = top[0] ; 
            if(checkRented.find({shop,movie})!=checkRented.end()){
                len++ ; 
                ans.push_back({shop,movie}) ; 
                rollback.push_back(top) ; 
            }
            recentMovies.pop() ; 
        }
        for (auto &p : rollback) recentMovies.push(p);
        return ans ; 
    }
};

/**
 * Your MovieRentingSystem object will be instantiated and called as such:
 * MovieRentingSystem* obj = new MovieRentingSystem(n, entries);
 * vector<int> param_1 = obj->search(movie);
 * obj->rent(shop,movie);
 * obj->drop(shop,movie);
 * vector<vector<int>> param_4 = obj->report();
 */
Editor is loading...
Leave a Comment