#include <bits/stdc++.h> using namespace std; typedef pair<int,int> pii; const int MX=500050; int n,w,h,i,li,lo,ri,ro,a[MX][2],b[MX][2],where[MX][2]; bool u[2*MX]; vector<pii> x,y; priority_queue<int> qli,qro; priority_queue<int,vector<int>,greater<int>> qlo,qri; int curres(const vector<pii>& x, int w) { if (qli.empty()) return x[qlo.top()].first+w-x[qro.top()].first; if (qlo.empty()) return max(0,x[qri.top()].first-x[qli.top()].first); li=x[qli.top()].first; lo=x[qlo.top()].first; ri=x[qri.top()].first; ro=x[qro.top()].first; if (ri<=lo || li>=ro) return ri-li; return max(0,lo-li)+max(0,ri-ro); } long long solve(const vector<pii>& x, int w) { memset(where,255,sizeof(where)); memset(u,false,sizeof(u)); while (!qli.empty()) qli.pop(); while (!qlo.empty()) qlo.pop(); while (!qri.empty()) qri.pop(); while (!qro.empty()) qro.pop(); for (int i=0; i<n; i++) { int k=x[i].second; if (where[k][0]==-1) { where[k][0]=i; qlo.push(i); } else { where[k][1]=i; qro.push(i); } } int res=curres(x,w); for (int i=0; i<n; i++) { int k=x[i].second; if (i==where[k][0]) { qli.push(i); u[i]=true; qri.push(where[k][1]); u[where[k][1]]=true; while (!qlo.empty() && u[qlo.top()]) qlo.pop(); while (!qro.empty() && u[qro.top()]) qro.pop(); } else { qlo.push(where[k][0]); u[where[k][0]]=false; qro.push(i); u[i]=false; while (!qli.empty() && !u[qli.top()]) qli.pop(); while (!qri.empty() && !u[qri.top()]) qri.pop(); } if (i==n-1 || x[i].first<x[i+1].first) res=max(res,curres(x,w)); } return res; } int main () { scanf("%d%d%d",&n,&w,&h); x.resize(n*2); y.resize(n*2); for (i=0; i<n; i++) { scanf("%d%d%d%d",&a[i][0],&a[i][1],&b[i][0],&b[i][1]); x[i*2]={a[i][0],i}; x[i*2+1]={b[i][0],i}; y[i*2]={a[i][1],i}; y[i*2+1]={b[i][1],i}; } n*=2; sort(x.begin(),x.end()); sort(y.begin(),y.end()); cout<<solve(x,w)*solve(y,h); 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 | #include <bits/stdc++.h> using namespace std; typedef pair<int,int> pii; const int MX=500050; int n,w,h,i,li,lo,ri,ro,a[MX][2],b[MX][2],where[MX][2]; bool u[2*MX]; vector<pii> x,y; priority_queue<int> qli,qro; priority_queue<int,vector<int>,greater<int>> qlo,qri; int curres(const vector<pii>& x, int w) { if (qli.empty()) return x[qlo.top()].first+w-x[qro.top()].first; if (qlo.empty()) return max(0,x[qri.top()].first-x[qli.top()].first); li=x[qli.top()].first; lo=x[qlo.top()].first; ri=x[qri.top()].first; ro=x[qro.top()].first; if (ri<=lo || li>=ro) return ri-li; return max(0,lo-li)+max(0,ri-ro); } long long solve(const vector<pii>& x, int w) { memset(where,255,sizeof(where)); memset(u,false,sizeof(u)); while (!qli.empty()) qli.pop(); while (!qlo.empty()) qlo.pop(); while (!qri.empty()) qri.pop(); while (!qro.empty()) qro.pop(); for (int i=0; i<n; i++) { int k=x[i].second; if (where[k][0]==-1) { where[k][0]=i; qlo.push(i); } else { where[k][1]=i; qro.push(i); } } int res=curres(x,w); for (int i=0; i<n; i++) { int k=x[i].second; if (i==where[k][0]) { qli.push(i); u[i]=true; qri.push(where[k][1]); u[where[k][1]]=true; while (!qlo.empty() && u[qlo.top()]) qlo.pop(); while (!qro.empty() && u[qro.top()]) qro.pop(); } else { qlo.push(where[k][0]); u[where[k][0]]=false; qro.push(i); u[i]=false; while (!qli.empty() && !u[qli.top()]) qli.pop(); while (!qri.empty() && !u[qri.top()]) qri.pop(); } if (i==n-1 || x[i].first<x[i+1].first) res=max(res,curres(x,w)); } return res; } int main () { scanf("%d%d%d",&n,&w,&h); x.resize(n*2); y.resize(n*2); for (i=0; i<n; i++) { scanf("%d%d%d%d",&a[i][0],&a[i][1],&b[i][0],&b[i][1]); x[i*2]={a[i][0],i}; x[i*2+1]={b[i][0],i}; y[i*2]={a[i][1],i}; y[i*2+1]={b[i][1],i}; } n*=2; sort(x.begin(),x.end()); sort(y.begin(),y.end()); cout<<solve(x,w)*solve(y,h); return 0; } |