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