Advertisement
nikunjsoni

850

May 30th, 2021
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.48 KB | None | 0 0
  1. class Solution {
  2.    
  3. struct event{
  4.     int x, y1, y2, type;
  5.     event(int x, int type, int y1, int y2):x(x),type(type),y1(y1),y2(y2){}
  6.     bool operator<(const event &a)const{
  7.         if(x != a.x)
  8.             return x < a.x;
  9.         return type < a.type;
  10.     }
  11. };
  12.    
  13. public:
  14.     int rectangleArea(vector<vector<int>>& rectangles) {
  15.         const int MOD = int(1e9)+7;
  16.         int area = 0;
  17.         multiset<event> events;
  18.         for(auto rec:rectangles){
  19.             events.insert(event(rec[0], 0, rec[1], rec[3]));
  20.             events.insert(event(rec[2], 1, rec[1], rec[3]));
  21.         }
  22.        
  23.         multiset<pair<int, int>> openEvents;
  24.         int prevX = 0;
  25.         for(auto ev: events){
  26.             int curX = ev.x;
  27.             area = (area + getArea(curX-prevX, openEvents, MOD))%MOD;
  28.             prevX = curX;
  29.             if(ev.type == 1)
  30.                 openEvents.erase(openEvents.lower_bound({ev.y1, ev.y2}));
  31.             else
  32.                 openEvents.insert({ev.y1, ev.y2});
  33.            
  34.         }
  35.         return area;
  36.     }
  37.    
  38.     int getArea(int width, multiset<pair<int, int>> &openEvents, int MOD){
  39.         long int area = 0, bottom = 0;
  40.         for(auto range: openEvents){
  41.             long int top = range.second;
  42.             bottom = max(bottom, long(range.first));
  43.             if(top>bottom)
  44.                 area = (area + (width*(top-bottom)))%MOD;
  45.             bottom = max(bottom, top);
  46.         }
  47.         return area;
  48.     }
  49.    
  50. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement