Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <vector>
- #include <set>
- #include <algorithm>
- #include <stdlib.h>
- struct Rect {
- // Координаты левого нижнего и правого верхнего углов прямоугольника
- int x_min, y_min, x_max, y_max;
- // Конструктор
- Rect(int x1 = 0, int y1 = 0, int x2 = 0, int y2 = 0)
- : x_min(std::min(x1, x2))
- , y_min(std::min(y1, y2))
- , x_max(std::max(x1, x2))
- , y_max(std::max(y1, y2))
- { }
- inline bool include (double x, double y) const {
- // Содержит ли прямоугольник точку (x, y) ?
- return x_min <= x && x <= x_max && y_min <= y && y <= y_max;
- }
- inline bool include (const Rect & R) const {
- // Содержит ли текущий прямоугольник полностью прямоугольник R?
- return include(R.x_min, R.y_min) && include(R.x_max, R.y_max);
- }
- inline int square() const {
- // Площадь прямоугольника
- return std::abs((x_max-x_min)*(y_max-y_min));
- }
- };
- // Оператор "меньше" для прямоугольников
- bool operator < (const Rect & A, const Rect & B) {
- return A.x_min < B.x_min || A.x_min == B.x_min && A.y_min < B.y_min;
- }
- int main() {
- freopen("input.txt", "rt", stdin);
- freopen("output.txt", "wt", stdout);
- // Считывание количества прямоугольников
- int n;
- scanf("%d", &n);
- // Вектор из всех прямоугольников
- std::vector<Rect> Rects(n);
- // Множество из всех встретившихся абсцисс и ординат точек
- std::set<int> sx, sy;
- for (auto & R : Rects) {
- // Считываем противоположные углы прямоугольника
- int x1, y1, x2, y2;
- scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
- // Запоминаем прямоугольник
- R = Rect(x1, y1, x2, y2);
- // Добавляем в множество всех встретившихся точек считанные точки
- sx.insert({x1, x2});
- sy.insert({y1, y2});
- }
- // Сортируем прямоугольники
- std::sort(Rects.begin(), Rects.end());
- // Сортируем встретившиеся точки
- std::vector<int> x(sx.begin(), sx.end());
- std::vector<int> y(sy.begin(), sy.end());
- // Разбиваем все пространство на непересекающиеся прямоугольники, углами которых будут встретившиеся точки
- std::vector<Rect> Fields;
- for (int i = 1; i < (int) x.size(); ++i)
- for (int j = 1; j < (int) y.size(); ++j)
- Fields.push_back(Rect(x[i-1], y[j-1], x[i], y[j]));
- // Считаем суммарную площадь тех прямоугольников из пространства, которые полностью вошли в хотя бы один из считанных прямоугольников
- int s = 0;
- for (auto & F : Fields)
- for (auto & R : Rects)
- if (R.include(F)) {
- s += F.square();
- break;
- }
- // Выводим ответ
- printf("%d", s);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement