//Jakub "Cubix651" Cisło
//Zadanie: Plemiona
#include <cstdio>
#include <algorithm>
const int MAXN = 100002;
typedef std::tuple<int, int, int, int> Four;
struct Rect
{
int x1, x2, y1, y2;
Rect(int a=0, int b=0, int c=0, int d=0)
{
x1 = a;
x2 = b;
y1 = c;
y2 = d;
}
operator Four ()
{
return std::make_tuple(x1, x2, y1,y2);
}
};
std::vector<Rect> rects;
bool intersect(const Rect& a, const Rect& b)
{
if(a.x2 > b.x1 && b.x2 > a.x1 && a.y2 > b.y1 && b.y2 > a.y1)
return true;
return false;
}
Rect join(const Rect& a, const Rect& b)
{
return Rect(std::min(a.x1, b.x1), std::max(a.x2, b.x2), std::min(a.y1, b.y1), std::max(a.y2, b.y2));
}
void swap(Rect* a, Rect* b)
{
Rect* tmp = a;
(*a) = (*b);
(*b) = (*tmp);
}
int n;
int main()
{
scanf("%d", &n);
rects.resize(n);
int a, b, c, d;
for(int i = 0; i < n; ++i)
{
scanf("%d%d%d%d", &a, &b, &c, &d);
rects[i] = Rect(a, b, c, d);
}
next:
for(int i = 0; i < n; ++i)
{
for(int j = i+1; j < n; ++j)
{
if(intersect(rects[i], rects[j]))
{
rects[i] = join(rects[i], rects[j]);
swap(&rects[j], &rects[n-1]);
n--;
rects.pop_back();
goto next;
}
}
}
printf("%d\n", n);
std::sort(rects.begin(), rects.end(), [](Rect a, Rect b){return Four(a) < Four(b);});
for(auto r : rects)
{
printf("%d %d %d %d\n", r.x1, r.x2, r.y1, r.y2);
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | //Jakub "Cubix651" Cisło //Zadanie: Plemiona #include <cstdio> #include <algorithm> const int MAXN = 100002; typedef std::tuple<int, int, int, int> Four; struct Rect { int x1, x2, y1, y2; Rect(int a=0, int b=0, int c=0, int d=0) { x1 = a; x2 = b; y1 = c; y2 = d; } operator Four () { return std::make_tuple(x1, x2, y1,y2); } }; std::vector<Rect> rects; bool intersect(const Rect& a, const Rect& b) { if(a.x2 > b.x1 && b.x2 > a.x1 && a.y2 > b.y1 && b.y2 > a.y1) return true; return false; } Rect join(const Rect& a, const Rect& b) { return Rect(std::min(a.x1, b.x1), std::max(a.x2, b.x2), std::min(a.y1, b.y1), std::max(a.y2, b.y2)); } void swap(Rect* a, Rect* b) { Rect* tmp = a; (*a) = (*b); (*b) = (*tmp); } int n; int main() { scanf("%d", &n); rects.resize(n); int a, b, c, d; for(int i = 0; i < n; ++i) { scanf("%d%d%d%d", &a, &b, &c, &d); rects[i] = Rect(a, b, c, d); } next: for(int i = 0; i < n; ++i) { for(int j = i+1; j < n; ++j) { if(intersect(rects[i], rects[j])) { rects[i] = join(rects[i], rects[j]); swap(&rects[j], &rects[n-1]); n--; rects.pop_back(); goto next; } } } printf("%d\n", n); std::sort(rects.begin(), rects.end(), [](Rect a, Rect b){return Four(a) < Four(b);}); for(auto r : rects) { printf("%d %d %d %d\n", r.x1, r.x2, r.y1, r.y2); } return 0; } |
English