#include <cstdio> #include <iostream> #include <algorithm> #define nm long long int #define unm unsigned long long int #define uint unsigned int #define srt(a, b) std::sort((a), (a)+(b)) using namespace std; struct kwadrat { uint x1; uint y1; uint x2; uint y2; }; struct abcd { kwadrat k; uint prev; uint next; bool f; }; vector< abcd > vec; abcd t; bool f=0,f2=0,f3; uint n,n2,frst=0,noop=0,j=0,c=0; bool col(kwadrat a, kwadrat b) { if(a.x1 < b.x2 && a.x2 > b.x1 && a.y1 < b.y2 && a.y2 > b.y1) return 1; return 0; } void join(uint a, uint b) { vec[vec[b].next].prev = vec[b].prev; vec[vec[b].prev].next = vec[b].next; vec[b].f=1; if(b==frst) frst = vec[b].next; //printf("Connecting %u %u %u %u with %u %u %u %u\n", vec[b].k.x1, vec[b].k.x2, vec[b].k.y1, vec[b].k.y2, vec[a].k.x1, vec[a].k.x2, vec[a].k.y1, vec[a].k.y2); vec[a].k.x1 = min(vec[b].k.x1, min(vec[a].k.x1,min(vec[b].k.x2, vec[a].k.x2))); vec[a].k.y1 = min(vec[b].k.y1, min(vec[a].k.y1,min(vec[b].k.y2, vec[a].k.y2))); vec[a].k.x2 = max(vec[b].k.x1, max(vec[a].k.x1,max(vec[b].k.x2, vec[a].k.x2))); vec[a].k.y2 = max(vec[b].k.y1, max(vec[a].k.y1,max(vec[b].k.y2, vec[a].k.y2))); //printf("Result: %u %u %u %u\n",vec[a].k.x1, vec[a].k.x2, vec[a].k.y1, vec[a].k.y2); n2--; } nm wys(kwadrat a) { return abs(a.y2-a.y1); } nm szer(kwadrat a){ return abs(a.x2-a.x1); } int main() { //std::ios_base::sync_with_stdio(0); scanf("%u", &n); n2=n; for(uint i=0;i<n;i++) { scanf("%u %u %u %u", &t.k.x1, &t.k.x2, &t.k.y1, &t.k.y2); if(!i) { t.prev=0; } else { vec[i-1].next=i; } t.next = i; vec.push_back(t); } j=frst; while(noop<=n2){ f=0; c=vec[frst].next; f2=0; f3=0; while(n2>1){ // printf("%u %u\n", c, j); if(vec[j].next==j&&f3) { j=frst; f3=0; } else if(vec[j].next==j) { f3=1; } if(vec[c].next==c) f2=1; if(col(vec[c].k,vec[j].k)) { join(j,c); f=1; // printf("COL\n"); } c=vec[c].next; if(f2) break; // } if(!f) ++noop; else noop=0; j=vec[j].next; } c=frst; n2=0; for(uint i=0;i<n;i++) if(!vec[i].f) ++n2; printf("%u\n", n2); c=frst; for(uint i=0;i<n;i++) if(!vec[i].f) printf("%u %u %u %u\n", vec[i].k.x1, vec[i].k.x2, vec[i].k.y1, vec[i].k.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 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 122 123 124 125 126 | #include <cstdio> #include <iostream> #include <algorithm> #define nm long long int #define unm unsigned long long int #define uint unsigned int #define srt(a, b) std::sort((a), (a)+(b)) using namespace std; struct kwadrat { uint x1; uint y1; uint x2; uint y2; }; struct abcd { kwadrat k; uint prev; uint next; bool f; }; vector< abcd > vec; abcd t; bool f=0,f2=0,f3; uint n,n2,frst=0,noop=0,j=0,c=0; bool col(kwadrat a, kwadrat b) { if(a.x1 < b.x2 && a.x2 > b.x1 && a.y1 < b.y2 && a.y2 > b.y1) return 1; return 0; } void join(uint a, uint b) { vec[vec[b].next].prev = vec[b].prev; vec[vec[b].prev].next = vec[b].next; vec[b].f=1; if(b==frst) frst = vec[b].next; //printf("Connecting %u %u %u %u with %u %u %u %u\n", vec[b].k.x1, vec[b].k.x2, vec[b].k.y1, vec[b].k.y2, vec[a].k.x1, vec[a].k.x2, vec[a].k.y1, vec[a].k.y2); vec[a].k.x1 = min(vec[b].k.x1, min(vec[a].k.x1,min(vec[b].k.x2, vec[a].k.x2))); vec[a].k.y1 = min(vec[b].k.y1, min(vec[a].k.y1,min(vec[b].k.y2, vec[a].k.y2))); vec[a].k.x2 = max(vec[b].k.x1, max(vec[a].k.x1,max(vec[b].k.x2, vec[a].k.x2))); vec[a].k.y2 = max(vec[b].k.y1, max(vec[a].k.y1,max(vec[b].k.y2, vec[a].k.y2))); //printf("Result: %u %u %u %u\n",vec[a].k.x1, vec[a].k.x2, vec[a].k.y1, vec[a].k.y2); n2--; } nm wys(kwadrat a) { return abs(a.y2-a.y1); } nm szer(kwadrat a){ return abs(a.x2-a.x1); } int main() { //std::ios_base::sync_with_stdio(0); scanf("%u", &n); n2=n; for(uint i=0;i<n;i++) { scanf("%u %u %u %u", &t.k.x1, &t.k.x2, &t.k.y1, &t.k.y2); if(!i) { t.prev=0; } else { vec[i-1].next=i; } t.next = i; vec.push_back(t); } j=frst; while(noop<=n2){ f=0; c=vec[frst].next; f2=0; f3=0; while(n2>1){ // printf("%u %u\n", c, j); if(vec[j].next==j&&f3) { j=frst; f3=0; } else if(vec[j].next==j) { f3=1; } if(vec[c].next==c) f2=1; if(col(vec[c].k,vec[j].k)) { join(j,c); f=1; // printf("COL\n"); } c=vec[c].next; if(f2) break; // } if(!f) ++noop; else noop=0; j=vec[j].next; } c=frst; n2=0; for(uint i=0;i<n;i++) if(!vec[i].f) ++n2; printf("%u\n", n2); c=frst; for(uint i=0;i<n;i++) if(!vec[i].f) printf("%u %u %u %u\n", vec[i].k.x1, vec[i].k.x2, vec[i].k.y1, vec[i].k.y2); return 0; } |