Advertisement
dmkozyrev

380.cpp

May 20th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.15 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <vector>
  3. #include <set>
  4. #include <algorithm>
  5. #include <stdlib.h>
  6.  
  7. struct Rect {
  8.     //  Координаты левого нижнего и правого верхнего углов прямоугольника
  9.     int x_min, y_min, x_max, y_max;
  10.    
  11.     //  Конструктор
  12.     Rect(int x1 = 0, int y1 = 0, int x2 = 0, int y2 = 0)
  13.         : x_min(std::min(x1, x2))
  14.         , y_min(std::min(y1, y2))
  15.         , x_max(std::max(x1, x2))
  16.         , y_max(std::max(y1, y2))
  17.         { }
  18.        
  19.     inline bool include (double x, double y) const {
  20.     //  Содержит ли прямоугольник точку (x, y) ?
  21.         return x_min <= x && x <= x_max && y_min <= y && y <= y_max;
  22.     }
  23.    
  24.     inline bool include (const Rect & R) const {
  25.     //  Содержит ли текущий прямоугольник полностью прямоугольник R?
  26.         return include(R.x_min, R.y_min) && include(R.x_max, R.y_max);
  27.     }
  28.    
  29.     inline int square() const {
  30.     //  Площадь прямоугольника
  31.         return std::abs((x_max-x_min)*(y_max-y_min));
  32.     }
  33. };
  34.  
  35. //  Оператор "меньше" для прямоугольников
  36. bool operator < (const Rect & A, const Rect & B) {
  37.     return A.x_min < B.x_min || A.x_min == B.x_min && A.y_min < B.y_min;
  38. }
  39.  
  40.  
  41. int main() {
  42.     freopen("input.txt", "rt", stdin);
  43.     freopen("output.txt", "wt", stdout);
  44.    
  45. //  Считывание количества прямоугольников
  46.     int n;
  47.     scanf("%d", &n);
  48.    
  49. //  Вектор из всех прямоугольников
  50.     std::vector<Rect> Rects(n);
  51.    
  52. //  Множество из всех встретившихся абсцисс и ординат точек
  53.     std::set<int> sx, sy;
  54.    
  55.     for (auto & R : Rects) {
  56.         //  Считываем противоположные углы прямоугольника
  57.         int x1, y1, x2, y2;
  58.         scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
  59.        
  60.         // Запоминаем прямоугольник
  61.         R = Rect(x1, y1, x2, y2);
  62.        
  63.         //  Добавляем в множество всех встретившихся точек считанные точки
  64.         sx.insert({x1, x2});
  65.         sy.insert({y1, y2});
  66.     }
  67.    
  68. //  Сортируем прямоугольники
  69.     std::sort(Rects.begin(), Rects.end());
  70.    
  71. //  Сортируем встретившиеся точки
  72.     std::vector<int> x(sx.begin(), sx.end());
  73.     std::vector<int> y(sy.begin(), sy.end());
  74.        
  75. //  Разбиваем все пространство на непересекающиеся прямоугольники, углами которых будут встретившиеся точки
  76.     std::vector<Rect> Fields;
  77.     for (int i = 1; i < (int) x.size(); ++i)
  78.         for (int j = 1; j < (int) y.size(); ++j)
  79.             Fields.push_back(Rect(x[i-1], y[j-1], x[i], y[j]));
  80.    
  81. //  Считаем суммарную площадь тех прямоугольников из пространства, которые полностью вошли в хотя бы один из считанных прямоугольников
  82.     int s = 0;
  83.     for (auto & F : Fields)
  84.         for (auto & R : Rects)
  85.             if (R.include(F)) {
  86.                 s += F.square();
  87.                 break;
  88.             }
  89.    
  90. //  Выводим ответ
  91.     printf("%d", s);
  92.    
  93.     return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement