#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; } |
English