nikunjsoni

855

May 29th, 2021
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.65 KB | None | 0 0
  1. struct interval{
  2.     static int N;
  3.     int l, r;
  4.     interval(int l, int r) : l(l), r(r) {}
  5.     int getDist()const{
  6.         if(l == 0) return r;
  7.         if(r == N - 1) return N - 1 - l;
  8.         if(r < l) return -1;
  9.         else return (r - l) / 2;
  10.     }
  11.     int getPos()const{
  12.         if(l == 0) return 0;
  13.         if(r == N - 1) return N - 1;
  14.         else return l + (r - l) / 2;
  15.     }
  16.     bool operator <(const interval& a)const{
  17.         int d1 = getDist(), d2 = a.getDist();
  18.         if(d1 != d2) return d1 > d2;
  19.         return l < a.l;
  20.     }
  21. };
  22.  
  23. int interval::N = 0;
  24. class ExamRoom {
  25. public:
  26.     set<interval> intervals;
  27.     map<int, int> l2r, r2l;
  28.    
  29.     ExamRoom(int N){
  30.         interval::N = N;
  31.         intervals.insert(interval(0, N - 1));
  32.         l2r[0] = N - 1;
  33.         r2l[N - 1] = 0;
  34.     }
  35.    
  36.     int seat(){
  37.         interval cur = *(intervals.begin());
  38.         intervals.erase(intervals.begin());
  39.        
  40.         int pos = cur.getPos();
  41.         intervals.insert(interval(cur.l, pos - 1));
  42.         intervals.insert(interval(pos + 1, cur.r));
  43.         l2r[cur.l] = pos - 1; r2l[pos - 1] = cur.l;
  44.         l2r[pos + 1] = cur.r; r2l[cur.r] = pos + 1;
  45.         return pos;
  46.     }
  47.    
  48.     void leave(int p){
  49.         int l = r2l[p - 1], r = l2r[p + 1];
  50.         intervals.erase(interval(l, p - 1));
  51.         intervals.erase(interval(p + 1, r));
  52.         intervals.insert(interval(l, r));
  53.         l2r[l] = r; r2l[r] = l;
  54.         r2l.erase(p - 1); l2r.erase(p + 1);
  55.     }
  56. };
  57. /**
  58.  * Your ExamRoom object will be instantiated and called as such:
  59.  * ExamRoom* obj = new ExamRoom(n);
  60.  * int param_1 = obj->seat();
  61.  * obj->leave(p);
  62.  */
Advertisement
Add Comment
Please, Sign In to add comment