// Karol Kosinski 2019 #include <cstdio> #include <algorithm> #include <map> #include <set> #include <stack> #include <vector> #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define FOD(i,b,a) for(int i=(b-1);i>=(a);--i) //#define DEBUG(x...) printf(x) #define DEBUG(x...) using namespace std; typedef long long LL; const int N2 = 1'000'007; struct LinePoint { int pos, id; // id > 0 => begin, else => end }; bool operator < (const LinePoint &a, const LinePoint &b) { if (a.pos != b.pos) return a.pos < b.pos; return a.id < b.id; } LinePoint X[N2], Y[N2]; struct StackSet { void push(int v) { S.push(v); Z.insert(v); } int top() { return S.top(); } void erase(int v) { Z.erase(v); while (Z.find(S.top()) == Z.end()) S.pop(); } stack<int> S; set<int> Z; }; int find_longest(LinePoint *T, int n, int lim) { sort(T, T + n); map<pair<int, int>, int> M; StackSet S; vector<int> V1, V2; S.push(0); V1.push_back(0); V2.push_back(0); FOR(i,0,n) { if (T[i].id > 0) S.push(T[i].id); else S.erase(-T[i].id); V1.push_back(S.top()); } FOD(i,n,0) { if (T[i].id < 0) S.push(-T[i].id); else S.erase(T[i].id); V2.push_back(S.top()); } reverse(V2.begin(), V2.end()); int prev_pos = 0; FOR(i,0,n) { int d = T[i].pos - prev_pos; auto mp = make_pair(V1[i], V2[i]); auto iter = M.find(mp); if (iter == M.end()) M[mp] = d; else iter->second += d; prev_pos = T[i].pos; } M[make_pair(0, 0)] += lim - prev_pos; int res = 0; for (const auto &el : M) res = max(el.second, res); return res; } int main() { int n, xlen, ylen; scanf("%d%d%d", &n, &xlen, &ylen); FOR(i,0,n) { int x1, y1, x2, y2; scanf("%d%d%d%d", &x1, &y1, &x2, &y2); X[2 * i].pos = min(x1, x2); X[2 * i].id = i + 1; X[2 * i + 1].pos = max(x1, x2); X[2 * i + 1].id = -i - 1; Y[2 * i].pos = min(y1, y2); Y[2 * i].id = i + 1; Y[2 * i + 1].pos = max(y1, y2); Y[2 * i + 1].id = -i - 1; } LL xres = find_longest(X, 2 * n, xlen); LL yres = find_longest(Y, 2 * n, ylen); printf("%lld\n", xres * yres); 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 | // Karol Kosinski 2019 #include <cstdio> #include <algorithm> #include <map> #include <set> #include <stack> #include <vector> #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define FOD(i,b,a) for(int i=(b-1);i>=(a);--i) //#define DEBUG(x...) printf(x) #define DEBUG(x...) using namespace std; typedef long long LL; const int N2 = 1'000'007; struct LinePoint { int pos, id; // id > 0 => begin, else => end }; bool operator < (const LinePoint &a, const LinePoint &b) { if (a.pos != b.pos) return a.pos < b.pos; return a.id < b.id; } LinePoint X[N2], Y[N2]; struct StackSet { void push(int v) { S.push(v); Z.insert(v); } int top() { return S.top(); } void erase(int v) { Z.erase(v); while (Z.find(S.top()) == Z.end()) S.pop(); } stack<int> S; set<int> Z; }; int find_longest(LinePoint *T, int n, int lim) { sort(T, T + n); map<pair<int, int>, int> M; StackSet S; vector<int> V1, V2; S.push(0); V1.push_back(0); V2.push_back(0); FOR(i,0,n) { if (T[i].id > 0) S.push(T[i].id); else S.erase(-T[i].id); V1.push_back(S.top()); } FOD(i,n,0) { if (T[i].id < 0) S.push(-T[i].id); else S.erase(T[i].id); V2.push_back(S.top()); } reverse(V2.begin(), V2.end()); int prev_pos = 0; FOR(i,0,n) { int d = T[i].pos - prev_pos; auto mp = make_pair(V1[i], V2[i]); auto iter = M.find(mp); if (iter == M.end()) M[mp] = d; else iter->second += d; prev_pos = T[i].pos; } M[make_pair(0, 0)] += lim - prev_pos; int res = 0; for (const auto &el : M) res = max(el.second, res); return res; } int main() { int n, xlen, ylen; scanf("%d%d%d", &n, &xlen, &ylen); FOR(i,0,n) { int x1, y1, x2, y2; scanf("%d%d%d%d", &x1, &y1, &x2, &y2); X[2 * i].pos = min(x1, x2); X[2 * i].id = i + 1; X[2 * i + 1].pos = max(x1, x2); X[2 * i + 1].id = -i - 1; Y[2 * i].pos = min(y1, y2); Y[2 * i].id = i + 1; Y[2 * i + 1].pos = max(y1, y2); Y[2 * i + 1].id = -i - 1; } LL xres = find_longest(X, 2 * n, xlen); LL yres = find_longest(Y, 2 * n, ylen); printf("%lld\n", xres * yres); return 0; } |