Advertisement
Manioc

sweep Line for intersection

Aug 27th, 2018
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.55 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAX 600007
  3.  
  4. using namespace std;
  5. typedef pair<int, int> pii;
  6. typedef long long ll;
  7.  
  8. int maior[4*MAX], idx[4*MAX], acum[4*MAX];
  9.  
  10. struct rect{
  11.     int x;
  12.     int ini, end;
  13.     int type;
  14.  
  15.     rect(int _x, int _ini, int _end, int _type): x(_x), ini(_ini), end(_end), type(_type) {}
  16. };
  17.  
  18. bool compare(rect a, rect b){
  19.     if(a.x == b.x) return a.type < b.type;
  20.     return a.x < b.x;
  21. }
  22.  
  23. void build(int id, int l, int r){
  24.     if(l == r) idx[id] = l;
  25.     else{
  26.         int mid = (l+r)/2;
  27.         build(2*id, l, mid);
  28.         build(2*id+1, mid+1, r);
  29.  
  30.         idx[id] = (maior[id] == maior[2*id]) ? idx[2*id]:idx[2*id+1];
  31.  
  32.     }
  33. }
  34. void add(int id, int val){
  35.     maior[id] += val;
  36.     acum[id] += val;
  37. }
  38. void update(int id, int l, int r, int x, int y, int val){
  39.     if(r < x || y < l) return;
  40.     else if(x <= l && r <= y) add(id, val);
  41.     else{
  42.         int mid = (l+r)/2;
  43.         add(2*id, acum[id]);
  44.         add(2*id+1, acum[id]);
  45.         acum[id] = 0;
  46.  
  47.         update(2*id, l, mid, x, y, val);
  48.         update(2*id+1, mid+1, r, x, y, val);
  49.  
  50.         maior[id] = max(maior[2*id], maior[2*id+1]);
  51.         idx[id] = (maior[id] == maior[2*id]) ? idx[2*id]:idx[2*id+1];
  52.     }
  53. }
  54.  
  55. // val - index
  56. pii query(int id, int l, int r, int x, int y){
  57.     if(r < x || y < l) return make_pair(0, 0);
  58.     else if(x <= l && r <= y) return make_pair(maior[id], idx[id]);
  59.     else{
  60.         int mid = (l+r)/2;
  61.         add(2*id, acum[id]);
  62.         add(2*id+1, acum[id]);
  63.         acum[id] = 0;
  64.  
  65.         return max(query(2*id, l, mid, x, y),
  66.                    query(2*id+1, mid+1, r, x, y));
  67.     }
  68. }
  69. void print(int sz){
  70.     for(int i = 1; i <= 4*sz; i++) cout << idx[i] << " \n"[i == 4*sz];
  71.     for(int i = 1; i <= 4*sz; i++) cout << maior[i] << " \n"[i == 4*sz];
  72. }
  73. map<ll, int> compress, descompress;
  74. vector<ll> vals;
  75. vector<rect> arr;
  76. int main(){
  77.     int n; scanf("%d", &n);
  78.     for(int i = 0; i < n; i++){
  79.         ll x1, y1, x2, y2; scanf("%lld %lld %lld %lld", &x1, &y1, &x2, &y2);
  80.         arr.emplace_back(x1, y1, y2, 0);
  81.         arr.emplace_back(x2, y1, y2, 1);
  82.         vals.push_back(x1);
  83.         vals.push_back(x2);
  84.         vals.push_back(y1);
  85.         vals.push_back(y2);
  86.     }
  87.  
  88.     sort(vals.begin(), vals.end());
  89.     sort(arr.begin(), arr.end(), compare);
  90.     int cnt = 0;
  91.     for(int i = 0; i < vals.size(); i++) {
  92.         if(!compress.count(vals[i])) {
  93.             compress[vals[i]] = cnt;
  94.             descompress[cnt++] = vals[i];
  95.         }
  96.     }
  97.  
  98.     pii ans = make_pair(-1, -1);
  99.     build(1, 0, cnt);
  100.     //print(cnt);
  101.     for(int i = 0; i < arr.size(); i++){
  102.  
  103.         rect atual = arr[i];
  104.         //cout << atual.x << " (" << atual.ini << ", " << atual.end << ") #" << atual.type << endl;  
  105.         //cout << "virou -> " << atual.x << " (" << compress[atual.ini] << ", " << compress[atual.end] << ") #" << atual.type << endl;  
  106.         if(atual.type == 0) {
  107.             update(1, 0, cnt, compress[atual.ini], compress[atual.end], 1);
  108.             //print(cnt);
  109.             pii encontro = query(1, 0, cnt, 0, cnt);
  110.             if(encontro.first >= n-1) {
  111.                 //cout << "#" << encontro.first << " " << encontro.second << endl;
  112.                 ans = make_pair(atual.x, descompress[encontro.second]);
  113.                 break;
  114.             }        
  115.         }else update(1, 0, cnt, compress[atual.ini], compress[atual.end], -1);
  116.  
  117.         //cout << query(1, 1, cnt, 1, cnt).first << " " << query(1, 1, cnt, 1, cnt).second << endl;
  118.     }
  119.  
  120.     printf("%d %d\n", ans.first, ans.second);
  121.     return 0;
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement