#include <cstdio>
#include <map>
#include <unordered_map>
#include <set>
#include <algorithm>
using lint = long long;
const int lim = 500001;
lint X1[lim], X2[lim], Y1[lim], Y2[lim];
lint bestOf(lint [], lint []);
int n;
int main() {
lint X, Y;
scanf("%d%lld%lld", &n, &X, &Y);
for(int i = 0; i < n; ++i) {
lint x1, y1, x2, y2;
scanf("%lld%lld%lld%lld", &x1, &y1, &x2, &y2);
if(x2 < x1) std::swap(x1, x2);
if(y2 < y1) std::swap(y1, y2);
X1[i] = x1;
X2[i] = x2;
Y1[i] = y1;
Y2[i] = y2;
}
X1[n] = 0ll;
X2[n] = X;
Y1[n] = 0ll;
Y2[n] = Y;
printf("%lld\n", bestOf(X1, X2) * bestOf(Y1, Y2));
return 0;
}
lint bestOf(lint A1[], lint A2[]) {
auto cmpAddQ = [&A1](int a, int b){
return A1[a] == A1[b] ? a > b : A1[a] < A1[b];
};
auto addQ = std::set<int,decltype(cmpAddQ)>(cmpAddQ);
auto cmpRemQ = [&A2](int a, int b){
return A2[a] == A2[b] ? a > b : A2[a] < A2[b];
};
auto remQ = std::set<int,decltype(cmpRemQ)>(cmpRemQ);
for(int i = 0; i <= n; ++i) {
addQ.insert(i);
remQ.insert(i);
}
std::unordered_map<lint, lint> results;
auto stack = std::set<int,decltype(cmpAddQ)>(cmpAddQ);
auto updateResults = [&results, &stack] (lint d) {
if(!stack.empty()) {
results[(1000000ll * *stack.rbegin()) + (lint)stack.size()] += d;
}
};
lint prevP = 0ll;
while(!remQ.empty()) {
if(!addQ.empty() && A1[*addQ.begin()] <= A2[*remQ.begin()]) {
auto i = *addQ.begin();
addQ.erase(addQ.begin());
lint currP = A1[i];
lint d = currP - prevP;
updateResults(d);
prevP = currP;
stack.insert(i);
} else {
auto i = *remQ.begin();
remQ.erase(remQ.begin());
lint currP = A2[i];
lint d = currP - prevP;
updateResults(d);
prevP = currP;
stack.erase(i);
}
}
lint best = 0ll;
for(auto [key, val] : results) {
best = std::max(best, val);
}
return best;
}
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 | #include <cstdio> #include <map> #include <unordered_map> #include <set> #include <algorithm> using lint = long long; const int lim = 500001; lint X1[lim], X2[lim], Y1[lim], Y2[lim]; lint bestOf(lint [], lint []); int n; int main() { lint X, Y; scanf("%d%lld%lld", &n, &X, &Y); for(int i = 0; i < n; ++i) { lint x1, y1, x2, y2; scanf("%lld%lld%lld%lld", &x1, &y1, &x2, &y2); if(x2 < x1) std::swap(x1, x2); if(y2 < y1) std::swap(y1, y2); X1[i] = x1; X2[i] = x2; Y1[i] = y1; Y2[i] = y2; } X1[n] = 0ll; X2[n] = X; Y1[n] = 0ll; Y2[n] = Y; printf("%lld\n", bestOf(X1, X2) * bestOf(Y1, Y2)); return 0; } lint bestOf(lint A1[], lint A2[]) { auto cmpAddQ = [&A1](int a, int b){ return A1[a] == A1[b] ? a > b : A1[a] < A1[b]; }; auto addQ = std::set<int,decltype(cmpAddQ)>(cmpAddQ); auto cmpRemQ = [&A2](int a, int b){ return A2[a] == A2[b] ? a > b : A2[a] < A2[b]; }; auto remQ = std::set<int,decltype(cmpRemQ)>(cmpRemQ); for(int i = 0; i <= n; ++i) { addQ.insert(i); remQ.insert(i); } std::unordered_map<lint, lint> results; auto stack = std::set<int,decltype(cmpAddQ)>(cmpAddQ); auto updateResults = [&results, &stack] (lint d) { if(!stack.empty()) { results[(1000000ll * *stack.rbegin()) + (lint)stack.size()] += d; } }; lint prevP = 0ll; while(!remQ.empty()) { if(!addQ.empty() && A1[*addQ.begin()] <= A2[*remQ.begin()]) { auto i = *addQ.begin(); addQ.erase(addQ.begin()); lint currP = A1[i]; lint d = currP - prevP; updateResults(d); prevP = currP; stack.insert(i); } else { auto i = *remQ.begin(); remQ.erase(remQ.begin()); lint currP = A2[i]; lint d = currP - prevP; updateResults(d); prevP = currP; stack.erase(i); } } lint best = 0ll; for(auto [key, val] : results) { best = std::max(best, val); } return best; } |
English