#include <cstdio> #include <vector> #include <algorithm> #define MAKS 100010 using namespace std; struct pr { int x1,x2,y1,y2; pr(int xx1,int xx2,int yy1,int yy2) : x1(xx1), x2(xx2),y1(yy1),y2(yy2) {} }; vector<pr> tmp[2]; bool tnie(const pr &a, const pr &b) { if(a.x1>=b.x2)return false; if(a.x2<=b.x1)return false; if(a.y1>=b.y2)return false; if(a.y2<=b.y1)return false; return true; } bool cmp(const pr &a, const pr &b) { if(a.x1!=b.x1)return a.x1<b.x1; if(a.x2!=b.x2)return a.x2<b.x2; if(a.y1!=b.y1)return a.y1<b.y1; return a.y2<b.y2; } int main() { int n; scanf("%d",&n); for(int i=0;i<n;i++) { int x1,x2,y1,y2; scanf("%d %d %d %d",&x1,&x2,&y1,&y2); tmp[0].push_back(pr(x1,x2,y1,y2)); } int akt=0; int poprz; bool ok; do { ok=true; poprz=akt; akt=1-akt; tmp[akt].clear(); int p=-1,d=-1; for(int i=0;i<tmp[poprz].size();i++) { for(int j=i+1;j<tmp[poprz].size();j++) { if(tnie(tmp[poprz][i],tmp[poprz][j])) { ok=false; p=i; d=j; break; } } if(!ok)break; } for(int i=0;i<tmp[poprz].size();i++) { if(i==p || i==d)continue; tmp[akt].push_back(tmp[poprz][i]); } if(!ok) { int x1=min(tmp[poprz][p].x1,tmp[poprz][d].x1); int x2=max(tmp[poprz][p].x2,tmp[poprz][d].x2); int y1=min(tmp[poprz][p].y1,tmp[poprz][d].y1); int y2=max(tmp[poprz][p].y2,tmp[poprz][d].y2); tmp[akt].push_back(pr(x1,x2,y1,y2)); } } while(!ok); sort(tmp[akt].begin(),tmp[akt].end(),cmp); printf("%d\n",(int)tmp[akt].size()); for(int i=0;i<tmp[akt].size();i++) { printf("%d %d %d %d\n",tmp[akt][i].x1,tmp[akt][i].x2,tmp[akt][i].y1,tmp[akt][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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | #include <cstdio> #include <vector> #include <algorithm> #define MAKS 100010 using namespace std; struct pr { int x1,x2,y1,y2; pr(int xx1,int xx2,int yy1,int yy2) : x1(xx1), x2(xx2),y1(yy1),y2(yy2) {} }; vector<pr> tmp[2]; bool tnie(const pr &a, const pr &b) { if(a.x1>=b.x2)return false; if(a.x2<=b.x1)return false; if(a.y1>=b.y2)return false; if(a.y2<=b.y1)return false; return true; } bool cmp(const pr &a, const pr &b) { if(a.x1!=b.x1)return a.x1<b.x1; if(a.x2!=b.x2)return a.x2<b.x2; if(a.y1!=b.y1)return a.y1<b.y1; return a.y2<b.y2; } int main() { int n; scanf("%d",&n); for(int i=0;i<n;i++) { int x1,x2,y1,y2; scanf("%d %d %d %d",&x1,&x2,&y1,&y2); tmp[0].push_back(pr(x1,x2,y1,y2)); } int akt=0; int poprz; bool ok; do { ok=true; poprz=akt; akt=1-akt; tmp[akt].clear(); int p=-1,d=-1; for(int i=0;i<tmp[poprz].size();i++) { for(int j=i+1;j<tmp[poprz].size();j++) { if(tnie(tmp[poprz][i],tmp[poprz][j])) { ok=false; p=i; d=j; break; } } if(!ok)break; } for(int i=0;i<tmp[poprz].size();i++) { if(i==p || i==d)continue; tmp[akt].push_back(tmp[poprz][i]); } if(!ok) { int x1=min(tmp[poprz][p].x1,tmp[poprz][d].x1); int x2=max(tmp[poprz][p].x2,tmp[poprz][d].x2); int y1=min(tmp[poprz][p].y1,tmp[poprz][d].y1); int y2=max(tmp[poprz][p].y2,tmp[poprz][d].y2); tmp[akt].push_back(pr(x1,x2,y1,y2)); } } while(!ok); sort(tmp[akt].begin(),tmp[akt].end(),cmp); printf("%d\n",(int)tmp[akt].size()); for(int i=0;i<tmp[akt].size();i++) { printf("%d %d %d %d\n",tmp[akt][i].x1,tmp[akt][i].x2,tmp[akt][i].y1,tmp[akt][i].y2); } } |