#include <cstdio> #include <vector> #include <algorithm> #define PB push_back using namespace std; struct q { int x1, x2, y1, y2; } el; vector<q> tab; int n; bool dzialaj; bool intersect(q el1, q el2) { return !(el2.x1 >= el1.x2 || el2.y1 >= el1.y2 || el2.x2 <= el1.x1 || el2.y2 <= el1.y1); } void merge() { q el1 = tab[tab.size()-1]; tab.pop_back(); q el2 = tab[tab.size()-1]; tab.pop_back(); if(intersect(el1,el2)) { q el3; el3.x1 = min(el1.x1, el2.x1); el3.y1 = min(el1.y1, el2.y1); el3.x2 = max(el1.x2, el2.x2); el3.y2 = max(el1.y2, el2.y2); tab.PB(el3); dzialaj = true; } else { tab.PB(el1); tab.PB(el2); } return ; } bool cmp(const q &el1, const q & el2) { return (el1.x1 < el2.x1) || (el1.x1 == el2.x1 && el1.x2 < el2.x2) || (el1.x1 == el2.x1 && el1.x2 == el2.x2 && el1.y1 < el2.y1) || (el1.x1 == el2.x1 && el1.x2 == el2.x2 && el1.y1 == el2.y1 && el1.y2 < el2.y2); } int main () { scanf("%d",&n); for(int i = 0; i < n; ++i) { scanf("%d%d%d%d",&el.x1,&el.x2,&el.y1,&el.y2); tab.PB(el); } dzialaj = true; while(dzialaj == true) { dzialaj = false; for(int i = tab.size()-1; i >= 0; --i) { for(int j = i-1; j >= 0; --j) { if(intersect(tab[i], tab[j])) { swap(tab[i],tab[max((int)tab.size()-1,0)]); swap(tab[j],tab[max((int)tab.size()-2,0)]); merge(); } } } } printf("%d\n", (int)tab.size()); sort(tab.begin(), tab.end(), cmp); for(int i = 0; i < tab.size(); ++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 | #include <cstdio> #include <vector> #include <algorithm> #define PB push_back using namespace std; struct q { int x1, x2, y1, y2; } el; vector<q> tab; int n; bool dzialaj; bool intersect(q el1, q el2) { return !(el2.x1 >= el1.x2 || el2.y1 >= el1.y2 || el2.x2 <= el1.x1 || el2.y2 <= el1.y1); } void merge() { q el1 = tab[tab.size()-1]; tab.pop_back(); q el2 = tab[tab.size()-1]; tab.pop_back(); if(intersect(el1,el2)) { q el3; el3.x1 = min(el1.x1, el2.x1); el3.y1 = min(el1.y1, el2.y1); el3.x2 = max(el1.x2, el2.x2); el3.y2 = max(el1.y2, el2.y2); tab.PB(el3); dzialaj = true; } else { tab.PB(el1); tab.PB(el2); } return ; } bool cmp(const q &el1, const q & el2) { return (el1.x1 < el2.x1) || (el1.x1 == el2.x1 && el1.x2 < el2.x2) || (el1.x1 == el2.x1 && el1.x2 == el2.x2 && el1.y1 < el2.y1) || (el1.x1 == el2.x1 && el1.x2 == el2.x2 && el1.y1 == el2.y1 && el1.y2 < el2.y2); } int main () { scanf("%d",&n); for(int i = 0; i < n; ++i) { scanf("%d%d%d%d",&el.x1,&el.x2,&el.y1,&el.y2); tab.PB(el); } dzialaj = true; while(dzialaj == true) { dzialaj = false; for(int i = tab.size()-1; i >= 0; --i) { for(int j = i-1; j >= 0; --j) { if(intersect(tab[i], tab[j])) { swap(tab[i],tab[max((int)tab.size()-1,0)]); swap(tab[j],tab[max((int)tab.size()-2,0)]); merge(); } } } } printf("%d\n", (int)tab.size()); sort(tab.begin(), tab.end(), cmp); for(int i = 0; i < tab.size(); ++i) { printf("%d %d %d %d\n", tab[i].x1, tab[i].x2, tab[i].y1, tab[i].y2); } } |