#include<cstdio> #include<algorithm> using namespace std; const int N = 1E5; struct Field { int x1, y1, x2, y2; }; Field a[N]; inline int readnum() { int a = 0, c; while((c = getchar() - '0') < 0); for(; c >= 0; c = getchar() - '0') a = 10*a + c; return a; } inline int compare(const Field &p, const Field &q) { const int dx1 = p.x1 - q.x1; const int dx2 = p.x2 - q.x2; const int dy1 = p.y1 - q.y1; return dx1 ? dx1 : dx2 ? dx2 : dy1 ? dy1 : p.y2 - q.y2; } inline bool compareLess(const Field &p, const Field &q) { return compare(p, q) < 0; } inline bool intersect(const Field &p, const Field &q) { return p.x1 < q.x2 && q.x1 < p.x2 && p.y1 < q.y2 && q.y1 < p.y2; } inline void update(Field &p, const Field &q) { p.x1 = min(p.x1, q.x1); p.x2 = max(p.x2, q.x2); p.y1 = min(p.y1, q.y1); p.y2 = max(p.y2, q.y2); } void brute(int n) { for(bool found = true; found; ) { found = false; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { if (i != j && intersect(a[i], a[j])) { update(a[i], a[j]); a[j] = a[--n]; found = true; } } } } sort(a, a + n, compareLess); printf("%d", n); for(int i = 0; i < n; i++) { printf("\n%d %d %d %d", a[i].x1, a[i].x2, a[i].y1, a[i].y2); } } int main() { const int n = readnum(); for(int i = 0; i < n; i++) { Field &p = a[i]; p.x1 = readnum(); p.x2 = readnum(); p.y1 = readnum(); p.y2 = readnum(); } brute(n); }
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 82 83 84 85 86 87 88 89 90 91 92 93 | #include<cstdio> #include<algorithm> using namespace std; const int N = 1E5; struct Field { int x1, y1, x2, y2; }; Field a[N]; inline int readnum() { int a = 0, c; while((c = getchar() - '0') < 0); for(; c >= 0; c = getchar() - '0') a = 10*a + c; return a; } inline int compare(const Field &p, const Field &q) { const int dx1 = p.x1 - q.x1; const int dx2 = p.x2 - q.x2; const int dy1 = p.y1 - q.y1; return dx1 ? dx1 : dx2 ? dx2 : dy1 ? dy1 : p.y2 - q.y2; } inline bool compareLess(const Field &p, const Field &q) { return compare(p, q) < 0; } inline bool intersect(const Field &p, const Field &q) { return p.x1 < q.x2 && q.x1 < p.x2 && p.y1 < q.y2 && q.y1 < p.y2; } inline void update(Field &p, const Field &q) { p.x1 = min(p.x1, q.x1); p.x2 = max(p.x2, q.x2); p.y1 = min(p.y1, q.y1); p.y2 = max(p.y2, q.y2); } void brute(int n) { for(bool found = true; found; ) { found = false; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { if (i != j && intersect(a[i], a[j])) { update(a[i], a[j]); a[j] = a[--n]; found = true; } } } } sort(a, a + n, compareLess); printf("%d", n); for(int i = 0; i < n; i++) { printf("\n%d %d %d %d", a[i].x1, a[i].x2, a[i].y1, a[i].y2); } } int main() { const int n = readnum(); for(int i = 0; i < n; i++) { Field &p = a[i]; p.x1 = readnum(); p.x2 = readnum(); p.y1 = readnum(); p.y2 = readnum(); } brute(n); } |