#include <cstdio> #include <algorithm> #include <vector> using namespace std; const int MAXN = 100005; struct poz { int x; int y; }; poz mkpoz(int x, int y) { poz a; a.x=x; a.y=y; return a; } struct ple { poz a; poz b; //a<b void scan() { scanf("%d%d%d%d", &a.x, &b.x, &a.y, &b.y); if (a.x>b.x) swap(a.x, b.x); if (a.y>b.y) swap(a.y, b.y); } }; bool operator<(ple k, ple l) { if (k.a.x!=l.a.x) return k.a.x<l.a.x; if (k.b.x!=l.b.x) return k.b.x<l.b.x; if (k.a.y!=l.a.y) return k.a.y<l.a.y; return k.b.y<l.b.y; } ple t[MAXN]; bool unu[MAXN]; vector<ple> vic; bool in(poz k, ple l) { if (l.a.x<k.x && k.x<l.b.x && l.a.y<k.y && k.y<l.b.y) return 1; return 0; } bool inter(int a, int b) { ple k=t[a]; ple l=t[b]; if (in(k.a, l)) return 1; if (in(k.b, l)) return 1; if (in(mkpoz(k.a.x, k.b.y), l)) return 1; if (in(mkpoz(k.b.x, k.a.y), l)) return 1; if (in(l.a, k)) return 1; if (in(l.b, k)) return 1; if (in(mkpoz(l.a.x, l.b.y), k)) return 1; if (in(mkpoz(l.b.x, l.a.y), k)) return 1; if (k.a.x<=l.a.x && l.b.x<=k.b.x && l.a.y<=k.a.y && k.b.y<=l.b.y) return 1; if (l.a.x<=k.a.x && k.b.x<=l.b.x && k.a.y<=l.a.y && l.b.y<=k.b.y) return 1; return 0; } ple conn(ple k, ple l) { ple w; w.a.x=min(k.a.x, l.a.x); w.a.y=min(k.a.y, l.a.y); w.b.x=max(k.b.x, l.b.x); w.b.y=max(k.b.y, l.b.y); return w; } void add(int id) { for (int i=0; i<id; i++) { if (unu[i] || !inter(id, i)) {continue;} //printf(" %d %d\n", i, id); t[id]=conn(t[i], t[id]); unu[i]=1; add(id); return; } } int main() { int n; scanf("%d", &n); for (int i=0; i<n; i++) { t[i].scan(); add(i); } for (int i=0; i<n; i++) if (!unu[i]) vic.push_back(t[i]); sort(vic.begin(), vic.end()); printf("%lu\n", vic.size()); for (int i=0; i<vic.size(); i++) printf("%d %d %d %d\n", vic[i].a.x, vic[i].b.x, vic[i].a.y, vic[i].b.y); 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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | #include <cstdio> #include <algorithm> #include <vector> using namespace std; const int MAXN = 100005; struct poz { int x; int y; }; poz mkpoz(int x, int y) { poz a; a.x=x; a.y=y; return a; } struct ple { poz a; poz b; //a<b void scan() { scanf("%d%d%d%d", &a.x, &b.x, &a.y, &b.y); if (a.x>b.x) swap(a.x, b.x); if (a.y>b.y) swap(a.y, b.y); } }; bool operator<(ple k, ple l) { if (k.a.x!=l.a.x) return k.a.x<l.a.x; if (k.b.x!=l.b.x) return k.b.x<l.b.x; if (k.a.y!=l.a.y) return k.a.y<l.a.y; return k.b.y<l.b.y; } ple t[MAXN]; bool unu[MAXN]; vector<ple> vic; bool in(poz k, ple l) { if (l.a.x<k.x && k.x<l.b.x && l.a.y<k.y && k.y<l.b.y) return 1; return 0; } bool inter(int a, int b) { ple k=t[a]; ple l=t[b]; if (in(k.a, l)) return 1; if (in(k.b, l)) return 1; if (in(mkpoz(k.a.x, k.b.y), l)) return 1; if (in(mkpoz(k.b.x, k.a.y), l)) return 1; if (in(l.a, k)) return 1; if (in(l.b, k)) return 1; if (in(mkpoz(l.a.x, l.b.y), k)) return 1; if (in(mkpoz(l.b.x, l.a.y), k)) return 1; if (k.a.x<=l.a.x && l.b.x<=k.b.x && l.a.y<=k.a.y && k.b.y<=l.b.y) return 1; if (l.a.x<=k.a.x && k.b.x<=l.b.x && k.a.y<=l.a.y && l.b.y<=k.b.y) return 1; return 0; } ple conn(ple k, ple l) { ple w; w.a.x=min(k.a.x, l.a.x); w.a.y=min(k.a.y, l.a.y); w.b.x=max(k.b.x, l.b.x); w.b.y=max(k.b.y, l.b.y); return w; } void add(int id) { for (int i=0; i<id; i++) { if (unu[i] || !inter(id, i)) {continue;} //printf(" %d %d\n", i, id); t[id]=conn(t[i], t[id]); unu[i]=1; add(id); return; } } int main() { int n; scanf("%d", &n); for (int i=0; i<n; i++) { t[i].scan(); add(i); } for (int i=0; i<n; i++) if (!unu[i]) vic.push_back(t[i]); sort(vic.begin(), vic.end()); printf("%lu\n", vic.size()); for (int i=0; i<vic.size(); i++) printf("%d %d %d %d\n", vic[i].a.x, vic[i].b.x, vic[i].a.y, vic[i].b.y); return 0; } |