#include <stdio.h> #include <stdlib.h> #include <list> typedef struct Ple { int x1,x2,y1,y2; } Ple; std::list<Ple> plemiona; std::list<Ple> panstwa; Ple* pan[100000]; int n; int cmp(const void *a, const void *b) { Ple *p=*(Ple **)a,*q=*(Ple **)b; if(p->x1-q->x1)return p->x1-q->x1; if(p->x2-q->x2)return p->x2-q->x2; if(p->y1-q->y1)return p->y1-q->y1; return p->y2-q->y2; } void scal(Ple *a,Ple *b) { a->x1=a->x1<b->x1?a->x1:b->x1; a->x2=a->x2<b->x2?b->x2:a->x2; a->y1=a->y1<b->y1?a->y1:b->y1; a->y2=a->y2<b->y2?b->y2:a->y2; } int zawiera(Ple *a,Ple *b) { if((a->x1<b->x1 && a->x2<b->x1) || (a->x1>b->x2 && a->x2>b->x2) || (a->x1<b->x1 && a->x2==b->x1) || (a->x1==b->x2 && a->x2>b->x2))return 0; if((a->y1<b->y1 && a->y2<b->y1) || (a->y1>b->y2 && a->y2>b->y2) || (a->y1<b->y1 && a->y2==b->y1) || (a->y1==b->y2 && a->y2>b->y2))return 0; return 1; } int main(void) { int i=0,x1,x2,y1,y2; int minx=1000000,maxx=0,miny=1000000,maxy=0; int ile=0; int sc; int ipan=0; scanf("%d",&n); for(;i<n;++i) { Ple p; scanf("%d %d %d %d",&p.x1,&p.x2,&p.y1,&p.y2); if(p.x2>maxx)maxx=p.x2; if(p.x1<minx)minx=p.x1; if(p.y2>maxy)maxy=p.y2; if(p.y1<miny)miny=p.y1; plemiona.push_back(p); ++ile; } int roz=ile; int granica=ile; while(roz) { Ple w; sc=0; std::list<Ple>::iterator fi=plemiona.begin(); w.x1=fi->x1; w.x2=fi->x2; w.y1=fi->y1; w.y2=fi->y2; std::list<Ple>::iterator it=plemiona.begin(); ++it; granica=0; while(granica<roz) { if(zawiera(&w,&(*it))) { scal(&w,&(*it)); plemiona.erase(it++); --ile; sc=1; } else it++; ++granica; } plemiona.erase(plemiona.begin()); if(sc) { plemiona.push_front(w); roz=ile; } else { plemiona.push_back(w); --roz; } } for (std::list<Ple>::iterator it=plemiona.begin();it!=plemiona.end(); ++it) { pan[ipan++]=&(*it); } printf("%d\n",ipan); qsort(pan,ipan,sizeof(Ple *),cmp); for(i=0;i<ipan;++i) { Ple *p=pan[i]; printf("%d %d %d %d\n",p->x1,p->x2,p->y1,p->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 | #include <stdio.h> #include <stdlib.h> #include <list> typedef struct Ple { int x1,x2,y1,y2; } Ple; std::list<Ple> plemiona; std::list<Ple> panstwa; Ple* pan[100000]; int n; int cmp(const void *a, const void *b) { Ple *p=*(Ple **)a,*q=*(Ple **)b; if(p->x1-q->x1)return p->x1-q->x1; if(p->x2-q->x2)return p->x2-q->x2; if(p->y1-q->y1)return p->y1-q->y1; return p->y2-q->y2; } void scal(Ple *a,Ple *b) { a->x1=a->x1<b->x1?a->x1:b->x1; a->x2=a->x2<b->x2?b->x2:a->x2; a->y1=a->y1<b->y1?a->y1:b->y1; a->y2=a->y2<b->y2?b->y2:a->y2; } int zawiera(Ple *a,Ple *b) { if((a->x1<b->x1 && a->x2<b->x1) || (a->x1>b->x2 && a->x2>b->x2) || (a->x1<b->x1 && a->x2==b->x1) || (a->x1==b->x2 && a->x2>b->x2))return 0; if((a->y1<b->y1 && a->y2<b->y1) || (a->y1>b->y2 && a->y2>b->y2) || (a->y1<b->y1 && a->y2==b->y1) || (a->y1==b->y2 && a->y2>b->y2))return 0; return 1; } int main(void) { int i=0,x1,x2,y1,y2; int minx=1000000,maxx=0,miny=1000000,maxy=0; int ile=0; int sc; int ipan=0; scanf("%d",&n); for(;i<n;++i) { Ple p; scanf("%d %d %d %d",&p.x1,&p.x2,&p.y1,&p.y2); if(p.x2>maxx)maxx=p.x2; if(p.x1<minx)minx=p.x1; if(p.y2>maxy)maxy=p.y2; if(p.y1<miny)miny=p.y1; plemiona.push_back(p); ++ile; } int roz=ile; int granica=ile; while(roz) { Ple w; sc=0; std::list<Ple>::iterator fi=plemiona.begin(); w.x1=fi->x1; w.x2=fi->x2; w.y1=fi->y1; w.y2=fi->y2; std::list<Ple>::iterator it=plemiona.begin(); ++it; granica=0; while(granica<roz) { if(zawiera(&w,&(*it))) { scal(&w,&(*it)); plemiona.erase(it++); --ile; sc=1; } else it++; ++granica; } plemiona.erase(plemiona.begin()); if(sc) { plemiona.push_front(w); roz=ile; } else { plemiona.push_back(w); --roz; } } for (std::list<Ple>::iterator it=plemiona.begin();it!=plemiona.end(); ++it) { pan[ipan++]=&(*it); } printf("%d\n",ipan); qsort(pan,ipan,sizeof(Ple *),cmp); for(i=0;i<ipan;++i) { Ple *p=pan[i]; printf("%d %d %d %d\n",p->x1,p->x2,p->y1,p->y2); } return 0; } |