#include <iostream> #include <vector> using namespace std; struct rect { int x1, y1, x2, y2; }; int n, X, Y; struct rect A[15]; long long maximum = 0; void com(vector<struct rect>& V, vector<struct rect>& W1, vector<struct rect>& W2) { int lenv = V.size(); int lenw = W1.size(); for (int j=0; j<lenv; j++) { for (int k=0; k<lenw; k++) { struct rect tmp; tmp.x1 = max(V[j].x1, W1[k].x1); tmp.y1 = max(V[j].y1, W1[k].y1); tmp.x2 = min(V[j].x2, W1[k].x2); tmp.y2 = min(V[j].y2, W1[k].y2); if (tmp.x1 < tmp.x2 && tmp.y1 < tmp.y2) { W2.push_back(tmp); } } } } void rec(int i, vector<struct rect>& V) { int lenv = V.size(); if (i == n) { long long area = 0; for (int j=0; j<lenv; j++) { area += (long long)(V[j].x2 - V[j].x1) * (long long)(V[j].y2 - V[j].y1); } if (area > maximum) { maximum = area; } } else { vector<struct rect> W1; vector<struct rect> W2; int lenw; // middle W1.push_back(A[i]); com(V, W1, W2); rec(i+1, W2); W1.clear(); W2.clear(); // horizontally struct rect tmp1 = {0, A[i].y1, A[i].x1, A[i].y2}; W1.push_back(tmp1); struct rect tmp2 = {A[i].x2, A[i].y1, X, A[i].y2}; W1.push_back(tmp2); com(V, W1, W2); rec(i+1, W2); W1.clear(); W2.clear(); // perpendicularly struct rect tmp3 = {A[i].x1, 0, A[i].x2, A[i].y1}; W1.push_back(tmp3); struct rect tmp4 = {A[i].x1, A[i].y2, A[i].x2, Y}; W1.push_back(tmp4); com(V, W1, W2); rec(i+1, W2); W1.clear(); W2.clear(); // rest struct rect tmp5 = {0, 0, A[i].x1, A[i].y1}; W1.push_back(tmp5); struct rect tmp6 = {0, A[i].y2, A[i].x1, Y}; W1.push_back(tmp6); struct rect tmp7 = {A[i].x2, A[i].y2, X, Y}; W1.push_back(tmp7); struct rect tmp8 = {A[i].x2, 0, X, A[i].y1}; W1.push_back(tmp8); com(V, W1, W2); rec(i+1, W2); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> X >> Y; for (int i=0; i<n; i++) { cin >> A[i].x1 >> A[i].y1 >> A[i].x2 >> A[i].y2; if (A[i].x1 > A[i].x2) { swap(A[i].x1, A[i].x2); } if (A[i].y1 > A[i].y2) { swap(A[i].y1, A[i].y2); } } vector<struct rect> V; struct rect tmp = {0, 0, X, Y}; V.push_back(tmp); rec(0, V); cout << maximum << '\n'; 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 | #include <iostream> #include <vector> using namespace std; struct rect { int x1, y1, x2, y2; }; int n, X, Y; struct rect A[15]; long long maximum = 0; void com(vector<struct rect>& V, vector<struct rect>& W1, vector<struct rect>& W2) { int lenv = V.size(); int lenw = W1.size(); for (int j=0; j<lenv; j++) { for (int k=0; k<lenw; k++) { struct rect tmp; tmp.x1 = max(V[j].x1, W1[k].x1); tmp.y1 = max(V[j].y1, W1[k].y1); tmp.x2 = min(V[j].x2, W1[k].x2); tmp.y2 = min(V[j].y2, W1[k].y2); if (tmp.x1 < tmp.x2 && tmp.y1 < tmp.y2) { W2.push_back(tmp); } } } } void rec(int i, vector<struct rect>& V) { int lenv = V.size(); if (i == n) { long long area = 0; for (int j=0; j<lenv; j++) { area += (long long)(V[j].x2 - V[j].x1) * (long long)(V[j].y2 - V[j].y1); } if (area > maximum) { maximum = area; } } else { vector<struct rect> W1; vector<struct rect> W2; int lenw; // middle W1.push_back(A[i]); com(V, W1, W2); rec(i+1, W2); W1.clear(); W2.clear(); // horizontally struct rect tmp1 = {0, A[i].y1, A[i].x1, A[i].y2}; W1.push_back(tmp1); struct rect tmp2 = {A[i].x2, A[i].y1, X, A[i].y2}; W1.push_back(tmp2); com(V, W1, W2); rec(i+1, W2); W1.clear(); W2.clear(); // perpendicularly struct rect tmp3 = {A[i].x1, 0, A[i].x2, A[i].y1}; W1.push_back(tmp3); struct rect tmp4 = {A[i].x1, A[i].y2, A[i].x2, Y}; W1.push_back(tmp4); com(V, W1, W2); rec(i+1, W2); W1.clear(); W2.clear(); // rest struct rect tmp5 = {0, 0, A[i].x1, A[i].y1}; W1.push_back(tmp5); struct rect tmp6 = {0, A[i].y2, A[i].x1, Y}; W1.push_back(tmp6); struct rect tmp7 = {A[i].x2, A[i].y2, X, Y}; W1.push_back(tmp7); struct rect tmp8 = {A[i].x2, 0, X, A[i].y1}; W1.push_back(tmp8); com(V, W1, W2); rec(i+1, W2); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> X >> Y; for (int i=0; i<n; i++) { cin >> A[i].x1 >> A[i].y1 >> A[i].x2 >> A[i].y2; if (A[i].x1 > A[i].x2) { swap(A[i].x1, A[i].x2); } if (A[i].y1 > A[i].y2) { swap(A[i].y1, A[i].y2); } } vector<struct rect> V; struct rect tmp = {0, 0, X, Y}; V.push_back(tmp); rec(0, V); cout << maximum << '\n'; return 0; } |