#include <iostream> #include <list> using namespace std; struct Prostokat { int x1, y1, x2, y2; Prostokat(int _x1, int _y1, int _x2, int _y2):x1(_x1), y1(_y1), x2(_x2), y2(_y2) {} }; list<Prostokat> pWynik, pWynik1, pWynikTmp[4], pWejscie; long long lWynik, lWynik1, lWynikTmp[4]; int n, X, Y; Prostokat pWe(0, 0, 0, 0), pWe1(0, 0, 0, 0); int maxZestaw; void rob(int nr) { Prostokat przec(0, 0, 0, 0); pWynikTmp[nr].clear(); lWynikTmp[nr] = 0; for (Prostokat pwe : pWejscie) { for (Prostokat pwy : pWynik) { //cout << pwy.x1 << "-" << pwy.y1 << "-" << pwy.x2 << "-" << pwy.y2 << endl; //cout << pwe.x1 << "-" << pwe.y1 << "-" << pwe.x2 << "-" << pwe.y2 << endl; przec.x1 = max(pwe.x1, pwy.x1); przec.y1 = max(pwe.y1, pwy.y1); przec.x2 = min(pwe.x2, pwy.x2); przec.y2 = min(pwe.y2, pwy.y2); if(przec.x1 < przec.x2 && przec.y1 < przec.y2) { pWynikTmp[nr].push_back(przec); lWynikTmp[nr] += (long long)(przec.x2 - przec.x1) * (przec.y2 - przec.y1); //cout << przec.x1 << "-" << przec.y1 << "-" << przec.x2 << "-" << przec.y2 << endl << endl; //cout << lWynikTmp[nr] << endl; } } } } void cztery() { //1 pWejscie.clear(); pWejscie.push_back(pWe); rob(0); lWynik = lWynikTmp[0]; maxZestaw = 0; //2 pWejscie.clear(); pWejscie.push_back(Prostokat(0, pWe.y1, pWe.x1, pWe.y2)); pWejscie.push_back(Prostokat(pWe.x2, pWe.y1, X, pWe.y2)); rob(1); if(lWynikTmp[1] > lWynik) { lWynik = lWynikTmp[1]; maxZestaw = 1; } //3 pWejscie.clear(); pWejscie.push_back(Prostokat(pWe.x1, pWe.y2, pWe.x2, Y)); pWejscie.push_back(Prostokat(pWe.x1, 0, pWe.x2, pWe.y1)); rob(2); if(lWynikTmp[2] > lWynik) { lWynik = lWynikTmp[2]; maxZestaw = 2; } //4 pWejscie.clear(); pWejscie.push_back(Prostokat(0, 0, pWe.x1, pWe.y1)); pWejscie.push_back(Prostokat(pWe.x2, 0, X, pWe.y1)); pWejscie.push_back(Prostokat(0, pWe.y2, pWe.x1, Y)); pWejscie.push_back(Prostokat(pWe.x2, pWe.y2, X, Y)); rob(3); if(lWynikTmp[3] > lWynik) { lWynik = lWynikTmp[3]; maxZestaw = 3; } } //cout << p.x1 << "-" << p.y1 << "-" << p.x2 << "-" << p.y2 << endl; int main() { ios_base::sync_with_stdio(0); cin >> n >> X >> Y; if(n == 1) { pWynik.clear(); pWynik.push_back(Prostokat(0, 0, X, Y)); cin >> pWe.x1 >> pWe.y1 >> pWe.x2 >> pWe.y2; if(pWe.x1 > pWe.x2) { swap(pWe.x1, pWe.x2); } if(pWe.y1 > pWe.y2) { swap(pWe.y1, pWe.y2); } cztery(); //cout << maxZestaw << endl; pWynik = pWynikTmp[maxZestaw]; } else { cin >> pWe1.x1 >> pWe1.y1 >> pWe1.x2 >> pWe1.y2; if(pWe1.x1 > pWe1.x2) { swap(pWe1.x1, pWe1.x2); } if(pWe1.y1 > pWe1.y2) { swap(pWe1.y1, pWe1.y2); } cin >> pWe.x1 >> pWe.y1 >> pWe.x2 >> pWe.y2; if(pWe.x1 > pWe.x2) { swap(pWe.x1, pWe.x2); } if(pWe.y1 > pWe.y2) { swap(pWe.y1, pWe.y2); } //1 pWynik.clear(); pWynik.push_back(pWe1); cztery(); lWynik1 = lWynik; pWynik1 = pWynikTmp[maxZestaw]; //2 pWynik.clear(); pWynik.push_back(Prostokat(0, pWe1.y1, pWe1.x1, pWe1.y2)); pWynik.push_back(Prostokat(pWe1.x2, pWe1.y1, X, pWe1.y2)); cztery(); if(lWynik > lWynik1) { lWynik1 = lWynik; pWynik1 = pWynikTmp[maxZestaw]; } //3 pWynik.clear(); pWynik.push_back(Prostokat(pWe1.x1, pWe1.y2, pWe1.x2, Y)); pWynik.push_back(Prostokat(pWe1.x1, 0, pWe1.x2, pWe1.y1)); cztery(); if(lWynik > lWynik1) { lWynik1 = lWynik; pWynik1 = pWynikTmp[maxZestaw]; } //4 pWynik.clear(); pWynik.push_back(Prostokat(0, 0, pWe1.x1, pWe1.y1)); pWynik.push_back(Prostokat(pWe1.x2, 0, X, pWe1.y1)); pWynik.push_back(Prostokat(0, pWe1.y2, pWe1.x1, Y)); pWynik.push_back(Prostokat(pWe1.x2, pWe1.y2, X, Y)); cztery(); if(lWynik > lWynik1) { lWynik1 = lWynik; pWynik1 = pWynikTmp[maxZestaw]; } lWynik = lWynik1; pWynik = pWynik1; for(int iN = 2; iN < n; ++iN) { cin >> pWe.x1 >> pWe.y1 >> pWe.x2 >> pWe.y2; if(pWe.x1 > pWe.x2) { swap(pWe.x1, pWe.x2); } if(pWe.y1 > pWe.y2) { swap(pWe.y1, pWe.y2); } cztery(); //cout << maxZestaw << endl; pWynik = pWynikTmp[maxZestaw]; } } cout << lWynik; 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 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 | #include <iostream> #include <list> using namespace std; struct Prostokat { int x1, y1, x2, y2; Prostokat(int _x1, int _y1, int _x2, int _y2):x1(_x1), y1(_y1), x2(_x2), y2(_y2) {} }; list<Prostokat> pWynik, pWynik1, pWynikTmp[4], pWejscie; long long lWynik, lWynik1, lWynikTmp[4]; int n, X, Y; Prostokat pWe(0, 0, 0, 0), pWe1(0, 0, 0, 0); int maxZestaw; void rob(int nr) { Prostokat przec(0, 0, 0, 0); pWynikTmp[nr].clear(); lWynikTmp[nr] = 0; for (Prostokat pwe : pWejscie) { for (Prostokat pwy : pWynik) { //cout << pwy.x1 << "-" << pwy.y1 << "-" << pwy.x2 << "-" << pwy.y2 << endl; //cout << pwe.x1 << "-" << pwe.y1 << "-" << pwe.x2 << "-" << pwe.y2 << endl; przec.x1 = max(pwe.x1, pwy.x1); przec.y1 = max(pwe.y1, pwy.y1); przec.x2 = min(pwe.x2, pwy.x2); przec.y2 = min(pwe.y2, pwy.y2); if(przec.x1 < przec.x2 && przec.y1 < przec.y2) { pWynikTmp[nr].push_back(przec); lWynikTmp[nr] += (long long)(przec.x2 - przec.x1) * (przec.y2 - przec.y1); //cout << przec.x1 << "-" << przec.y1 << "-" << przec.x2 << "-" << przec.y2 << endl << endl; //cout << lWynikTmp[nr] << endl; } } } } void cztery() { //1 pWejscie.clear(); pWejscie.push_back(pWe); rob(0); lWynik = lWynikTmp[0]; maxZestaw = 0; //2 pWejscie.clear(); pWejscie.push_back(Prostokat(0, pWe.y1, pWe.x1, pWe.y2)); pWejscie.push_back(Prostokat(pWe.x2, pWe.y1, X, pWe.y2)); rob(1); if(lWynikTmp[1] > lWynik) { lWynik = lWynikTmp[1]; maxZestaw = 1; } //3 pWejscie.clear(); pWejscie.push_back(Prostokat(pWe.x1, pWe.y2, pWe.x2, Y)); pWejscie.push_back(Prostokat(pWe.x1, 0, pWe.x2, pWe.y1)); rob(2); if(lWynikTmp[2] > lWynik) { lWynik = lWynikTmp[2]; maxZestaw = 2; } //4 pWejscie.clear(); pWejscie.push_back(Prostokat(0, 0, pWe.x1, pWe.y1)); pWejscie.push_back(Prostokat(pWe.x2, 0, X, pWe.y1)); pWejscie.push_back(Prostokat(0, pWe.y2, pWe.x1, Y)); pWejscie.push_back(Prostokat(pWe.x2, pWe.y2, X, Y)); rob(3); if(lWynikTmp[3] > lWynik) { lWynik = lWynikTmp[3]; maxZestaw = 3; } } //cout << p.x1 << "-" << p.y1 << "-" << p.x2 << "-" << p.y2 << endl; int main() { ios_base::sync_with_stdio(0); cin >> n >> X >> Y; if(n == 1) { pWynik.clear(); pWynik.push_back(Prostokat(0, 0, X, Y)); cin >> pWe.x1 >> pWe.y1 >> pWe.x2 >> pWe.y2; if(pWe.x1 > pWe.x2) { swap(pWe.x1, pWe.x2); } if(pWe.y1 > pWe.y2) { swap(pWe.y1, pWe.y2); } cztery(); //cout << maxZestaw << endl; pWynik = pWynikTmp[maxZestaw]; } else { cin >> pWe1.x1 >> pWe1.y1 >> pWe1.x2 >> pWe1.y2; if(pWe1.x1 > pWe1.x2) { swap(pWe1.x1, pWe1.x2); } if(pWe1.y1 > pWe1.y2) { swap(pWe1.y1, pWe1.y2); } cin >> pWe.x1 >> pWe.y1 >> pWe.x2 >> pWe.y2; if(pWe.x1 > pWe.x2) { swap(pWe.x1, pWe.x2); } if(pWe.y1 > pWe.y2) { swap(pWe.y1, pWe.y2); } //1 pWynik.clear(); pWynik.push_back(pWe1); cztery(); lWynik1 = lWynik; pWynik1 = pWynikTmp[maxZestaw]; //2 pWynik.clear(); pWynik.push_back(Prostokat(0, pWe1.y1, pWe1.x1, pWe1.y2)); pWynik.push_back(Prostokat(pWe1.x2, pWe1.y1, X, pWe1.y2)); cztery(); if(lWynik > lWynik1) { lWynik1 = lWynik; pWynik1 = pWynikTmp[maxZestaw]; } //3 pWynik.clear(); pWynik.push_back(Prostokat(pWe1.x1, pWe1.y2, pWe1.x2, Y)); pWynik.push_back(Prostokat(pWe1.x1, 0, pWe1.x2, pWe1.y1)); cztery(); if(lWynik > lWynik1) { lWynik1 = lWynik; pWynik1 = pWynikTmp[maxZestaw]; } //4 pWynik.clear(); pWynik.push_back(Prostokat(0, 0, pWe1.x1, pWe1.y1)); pWynik.push_back(Prostokat(pWe1.x2, 0, X, pWe1.y1)); pWynik.push_back(Prostokat(0, pWe1.y2, pWe1.x1, Y)); pWynik.push_back(Prostokat(pWe1.x2, pWe1.y2, X, Y)); cztery(); if(lWynik > lWynik1) { lWynik1 = lWynik; pWynik1 = pWynikTmp[maxZestaw]; } lWynik = lWynik1; pWynik = pWynik1; for(int iN = 2; iN < n; ++iN) { cin >> pWe.x1 >> pWe.y1 >> pWe.x2 >> pWe.y2; if(pWe.x1 > pWe.x2) { swap(pWe.x1, pWe.x2); } if(pWe.y1 > pWe.y2) { swap(pWe.y1, pWe.y2); } cztery(); //cout << maxZestaw << endl; pWynik = pWynikTmp[maxZestaw]; } } cout << lWynik; return 0; } |