#include <cstdio> #include <algorithm> #include <vector> using namespace std; const int n2 = 1<<20; const int N = 100005; struct pro { int x1, x2, y1, y2; void popraw( pro A ) { // printf("polacz %d %d %d %d i %d %d %d %d\n",x1,x2,y1,y2,A.x1,A.x2,A.y1,A.y2 ); x1 = min( A.x1, x1 ); x2 = max( A.x2, x2 ); y1 = min( A.y1, y1 ); y2 = max( A.y2, y2 ); } }; pro wsp[N]; bool usu[N]; pro corr[N]; vector <int> pop; bool cmp2(pro A,pro 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; } inline int miesci(int a) { for (int i=0;i<pop.size();i++) if ( max(wsp[ pop[i] ].x1, wsp[ a ].x1) < min(wsp[ pop[i] ].x2, wsp[ a ].x2) && max(wsp[ pop[i] ].y1, wsp[ a ].y1) < min(wsp[ pop[i] ].y2, wsp[ a ].y2) ) return i; return -1; } int main() { int n,a,b,c,d; scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d%d%d%d", &wsp[i].x1, &wsp[i].x2, &wsp[i].y1, &wsp[i].y2 ); } // sort( wsp+1, wsp+n+1, cmp ); for (int i=1;i<=n;i++) { //Czytanie na jakie przedziały wejdziemy a = miesci( i ); while( a!=-1 ) { //Usuwanie przedziałów na które weszliśmy i poprawianie naszej wartości usu[ pop[a] ] = 1; wsp[i].popraw( wsp[ pop[a] ] ); swap( pop[ a ], pop.back() ); pop.pop_back(); a = miesci( i ); } //Wstawianie nowych wartości na drzewo pop.push_back( i ); } //Wypisywanie wyniku int C = 0; for (int i=1;i<=n;i++) if (usu[i]==0) corr[ C++ ] = wsp[i]; sort( corr, corr+C, cmp2 ); printf("%d\n",C); for (int i=0;i<C;i++) printf("%d %d %d %d\n",corr[i].x1, corr[i].x2, corr[i].y1, corr[i].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 | #include <cstdio> #include <algorithm> #include <vector> using namespace std; const int n2 = 1<<20; const int N = 100005; struct pro { int x1, x2, y1, y2; void popraw( pro A ) { // printf("polacz %d %d %d %d i %d %d %d %d\n",x1,x2,y1,y2,A.x1,A.x2,A.y1,A.y2 ); x1 = min( A.x1, x1 ); x2 = max( A.x2, x2 ); y1 = min( A.y1, y1 ); y2 = max( A.y2, y2 ); } }; pro wsp[N]; bool usu[N]; pro corr[N]; vector <int> pop; bool cmp2(pro A,pro 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; } inline int miesci(int a) { for (int i=0;i<pop.size();i++) if ( max(wsp[ pop[i] ].x1, wsp[ a ].x1) < min(wsp[ pop[i] ].x2, wsp[ a ].x2) && max(wsp[ pop[i] ].y1, wsp[ a ].y1) < min(wsp[ pop[i] ].y2, wsp[ a ].y2) ) return i; return -1; } int main() { int n,a,b,c,d; scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d%d%d%d", &wsp[i].x1, &wsp[i].x2, &wsp[i].y1, &wsp[i].y2 ); } // sort( wsp+1, wsp+n+1, cmp ); for (int i=1;i<=n;i++) { //Czytanie na jakie przedziały wejdziemy a = miesci( i ); while( a!=-1 ) { //Usuwanie przedziałów na które weszliśmy i poprawianie naszej wartości usu[ pop[a] ] = 1; wsp[i].popraw( wsp[ pop[a] ] ); swap( pop[ a ], pop.back() ); pop.pop_back(); a = miesci( i ); } //Wstawianie nowych wartości na drzewo pop.push_back( i ); } //Wypisywanie wyniku int C = 0; for (int i=1;i<=n;i++) if (usu[i]==0) corr[ C++ ] = wsp[i]; sort( corr, corr+C, cmp2 ); printf("%d\n",C); for (int i=0;i<C;i++) printf("%d %d %d %d\n",corr[i].x1, corr[i].x2, corr[i].y1, corr[i].y2); return 0; } |