#include <cstdio> #include <algorithm> #define MAX 100009 using namespace std; struct prost{ prost () {}; prost (int a, int b, int c, int d){ x1 = a; y1 = b; x2 = c; y2 = d; } int x1, y1, x2, y2; }; bool intersect(prost a, prost b){ if(a.x1 >= b.x2)return 0; if(a.x2 <= b.x1)return 0; if(a.y1 >= b.y2)return 0; if(a.y2 <= b.y1)return 0; return 1; } bool operator<(const prost &a, const prost &b){ if(a.x1 == b.x1){ if(a.x2 == b.x2){ if(a.y1 == b.y1){ return a.y2 < b.y2; } return a.y1 < b.y1; } return a.x2 < b.x2; } return a.x1 < b.x1; } prost operator+(const prost &a, const prost &b){ prost pom; pom.x1 = min(a.x1, b.x1); pom.x2 = max(a.x2, b.x2); pom.y1 = min(a.y1, b.y1); pom.y2 = max(a.y2, b.y2); return pom; } void wypisz(prost a){ printf("(%d, %d) - (%d, %d)\n", a.x1, a.y1, a.x2, a.y2); } prost tab[MAX]; int main (){ int n; scanf("%d", &n); int a, b, c, d; for(int i=1; i<=n; i++){ scanf("%d%d%d%d", &a, &c, &b, &d); tab[i] = prost(a, b, c, d); } random_shuffle(tab + 1, tab + n + 1); bool zmiana = true; while(zmiana){ zmiana = false; for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ if(i > n)break; if(i == j)continue; if(intersect(tab[i], tab[j])){ zmiana = true; //printf("przecinaja sie\n");wypisz(tab[i]); wypisz(tab[j]); tab[i] = tab[i] + tab[j]; //printf("powstaje "); wypisz(tab[i]); swap(tab[j], tab[n]); n--; j--; } else { //printf("nie przecinaja sie\n"); wypisz(tab[i]); wypisz(tab[j]); } } } //printf("%d ", n); } printf("%d\n", n); sort(tab + 1, tab + n + 1); for(int i=1; i<=n; i++)printf("%d %d %d %d\n", tab[i].x1, tab[i].x2, tab[i].y1, tab[i].y2); }
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 | #include <cstdio> #include <algorithm> #define MAX 100009 using namespace std; struct prost{ prost () {}; prost (int a, int b, int c, int d){ x1 = a; y1 = b; x2 = c; y2 = d; } int x1, y1, x2, y2; }; bool intersect(prost a, prost b){ if(a.x1 >= b.x2)return 0; if(a.x2 <= b.x1)return 0; if(a.y1 >= b.y2)return 0; if(a.y2 <= b.y1)return 0; return 1; } bool operator<(const prost &a, const prost &b){ if(a.x1 == b.x1){ if(a.x2 == b.x2){ if(a.y1 == b.y1){ return a.y2 < b.y2; } return a.y1 < b.y1; } return a.x2 < b.x2; } return a.x1 < b.x1; } prost operator+(const prost &a, const prost &b){ prost pom; pom.x1 = min(a.x1, b.x1); pom.x2 = max(a.x2, b.x2); pom.y1 = min(a.y1, b.y1); pom.y2 = max(a.y2, b.y2); return pom; } void wypisz(prost a){ printf("(%d, %d) - (%d, %d)\n", a.x1, a.y1, a.x2, a.y2); } prost tab[MAX]; int main (){ int n; scanf("%d", &n); int a, b, c, d; for(int i=1; i<=n; i++){ scanf("%d%d%d%d", &a, &c, &b, &d); tab[i] = prost(a, b, c, d); } random_shuffle(tab + 1, tab + n + 1); bool zmiana = true; while(zmiana){ zmiana = false; for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ if(i > n)break; if(i == j)continue; if(intersect(tab[i], tab[j])){ zmiana = true; //printf("przecinaja sie\n");wypisz(tab[i]); wypisz(tab[j]); tab[i] = tab[i] + tab[j]; //printf("powstaje "); wypisz(tab[i]); swap(tab[j], tab[n]); n--; j--; } else { //printf("nie przecinaja sie\n"); wypisz(tab[i]); wypisz(tab[j]); } } } //printf("%d ", n); } printf("%d\n", n); sort(tab + 1, tab + n + 1); for(int i=1; i<=n; i++)printf("%d %d %d %d\n", tab[i].x1, tab[i].x2, tab[i].y1, tab[i].y2); } |