BOJ 1945 - 직사각형

image.png

흔한 문제이다. 각 직사각형의 왼쪽 위와 오른쪽 아래 점을 각도에 따라 정렬해두고 스위핑해주자.

struct event {
   int x, y, z;
};

void solve() {
   int n;
   cin >> n;
   vector<event> e;
   for (int i = 0; i < n; i++) {
      int x1, y1, x2, y2;
      cin >> x1 >> y1 >> x2 >> y2;
      assert(x1 < x2 && y1 < y2);
      e.pb({x1, y2, 1});
      e.pb({x2, y1, -1});
   }
   int overlap = 0;
   sort(all(e), [&](auto &a, auto &b) {
      // ay / ax < by / bx
      if (a.y * b.x == a.x * b.y) {
         // 추가되는 것부터 앞에
         return a.z > b.z;
      }
      return a.y * b.x > a.x * b.y;
   });
   int ans = 0;
   for (int i = 0; i < n * 2; i++) {
      debug(e[i].x, e[i].y, e[i].z);
      overlap += e[i].z;
      ans = max(ans, overlap);
   }
   cout << ans;
}

Tags:

Categories:

Updated:

Comments