matheus_monteiro

F - Rectangles

Jun 2nd, 2021 (edited)
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.22 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int MAX = 1000000;
  4.  
  5. struct Event {
  6.     int x1, x2, y, t;
  7.     Event(int _x1, int _x2, int _y, int _t) {
  8.         x1 = _x1, x2 = _x2, y = _y, t = _t;
  9.     }
  10.     Event(){}
  11. };
  12.  
  13. int n;
  14. int tree[MAX];
  15. int lazy[MAX];
  16. vector<int> values;
  17. vector<Event> ev;
  18.  
  19. void push(int node, int start, int end) {
  20.     tree[node] = values[end + 1] - values[start] - tree[node];
  21.     if(start != end) {
  22.         lazy[2 * node] ^= 1;
  23.         lazy[2 * node + 1] ^= 1;
  24.     }      
  25.     lazy[node] = 0;
  26. }
  27.  
  28. void update(int node, int start, int end, int l, int r) {
  29.     if(lazy[node]) push(node, start, end);
  30.     if(start > r or l > end) return;
  31.     if(l <= start and end <= r) push(node, start, end);
  32.     else {
  33.         int mid = (start + end) / 2;
  34.         update(2 * node, start, mid, l, r);
  35.         update(2 * node + 1, mid + 1, end, l, r);
  36.         tree[node] = tree[2 * node] + tree[2 * node + 1];
  37.     }
  38. }
  39.  
  40. int query() {
  41.     if(lazy[1]) push(1, 0, (int)values.size() - 1);
  42.     return tree[1];
  43. }
  44.  
  45. int get_pos(int x){
  46.     return lower_bound(values.begin(), values.end(), x) - values.begin();
  47. }
  48.  
  49. bool cmp(Event a, Event b) {
  50.     if(a.y != b.y) return a.y < b.y;
  51.     return a.t < b.t;
  52. }
  53.  
  54. int32_t main() {  
  55.     scanf(" %d", &n);
  56.     for(int i = 0; i < n; i++) {
  57.         int x1, y1, x2, y2;
  58.         scanf(" %d %d %d %d", &x1, &y1, &x2, &y2);
  59.         int xmi = min(x1, x2);
  60.         int ymi = min(y1, y2);
  61.         int xma = max(x1, x2);
  62.         int yma = max(y1, y2);
  63.  
  64.         ev.emplace_back(xmi, xma, ymi, -1);
  65.         ev.emplace_back(xmi, xma, yma, 1);
  66.        
  67.         values.push_back(xmi);
  68.         values.push_back(xma);
  69.     }
  70.  
  71.     values.push_back(1000000007);
  72.  
  73.     sort(values.begin(), values.end());
  74.     values.resize(unique(values.begin(), values.end()) - values.begin());
  75.  
  76.     sort(ev.begin(), ev.end(), cmp);
  77.  
  78.     long long Y = 0, ans = 0;
  79.    
  80.     for(int i = 0; i < ev.size(); i++) {
  81.         long long s = query();
  82.         long long aux = s * 1LL * (ev[i].y - Y);
  83.         update(1, 0, (int)values.size() - 1, get_pos(ev[i].x1), get_pos(ev[i].x2) - 1);
  84.         Y = ev[i].y;
  85.         ans += aux;
  86.     }
  87.     cout << ans << '\n';
  88.  
  89.     return 0;
  90. }
  91.  
Add Comment
Please, Sign In to add comment