// Terytoria [B]
// Jakub Rożek
#include <bits/stdc++.h>
using namespace std;
long long odp;
long long n,X,Y,q,w,e,r,vps;
vector <long long> v;
vector <long long> v2;
vector <pair<long long,long long> > vp;
vector <pair<long long,long long> > vp2;
long long rek(int i)
{
long long wynik=0,a,b,e=0;
a=vp[i].first;
b=-vp[i].second;
++i;
for( i; i<vps && a<b && vp[i].first<b ; ++i)
{
if(vp[i].first>=a)
{
e+=vp[i].first-a;
if(-vp[i].second<=b) wynik=max(wynik, rek(i) );
}
a=max(a,-vp[i].second);
}
if(a<b) e+=b-a;
wynik=max(wynik,e);
return wynik;
}
long long licz()
{
sort(v.begin(), v.end());
sort(vp.begin(), vp.end());
long long wynik=0,a=0,b,c,d,e=0;
b=vp.size();
vps=b;
for(int i=0; i<b; ++i)
{
if(vp[i].first>=a)
{
e+=vp[i].first-a;
wynik=max(wynik, rek(i) );
}
a=max(a,-vp[i].second);
}
e+=v[v.size()-1]-a;
wynik=max(wynik,e);
for(int i=v.size()-1; i>0; --i)
wynik=max(wynik, v[i]-v[i-1] );
a=0;
for(int i=0; i<b; ++i)
{
while(v[a]<=vp[i].first) ++a;
if(-vp[i].second==v[a])
{
e=i;
c=a-1;
d=a;
while( e>=0 && vp[e].first==v[c] && -vp[e].second==v[d])
{
wynik=max(wynik, v[d+1]-v[d]+v[c]-v[c-1] );
--e;
--c;
++d;
}
}
}
return wynik;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin>>n>>X>>Y;
v.push_back(0);
v2.push_back(0);
for(int i=0; i<n; ++i)
{
cin>>q>>w>>e>>r;
if(q>e) swap(q,e);
if(w>r) swap(w,r);
v.push_back(q);
v.push_back(e);
v2.push_back(w);
v2.push_back(r);
vp.push_back({q,-e});
vp2.push_back({w,-r});
}
v.push_back(X);
v2.push_back(Y);
odp=licz();
for(int i=v.size()-1; i>=0; --i) v[i]=v2[i];
for(int i=vp.size()-1; i>=0; --i)
{
vp[i].first=vp2[i].first;
vp[i].second=vp2[i].second;
}
odp*=licz();
cout<<odp;
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 | // Terytoria [B] // Jakub Rożek #include <bits/stdc++.h> using namespace std; long long odp; long long n,X,Y,q,w,e,r,vps; vector <long long> v; vector <long long> v2; vector <pair<long long,long long> > vp; vector <pair<long long,long long> > vp2; long long rek(int i) { long long wynik=0,a,b,e=0; a=vp[i].first; b=-vp[i].second; ++i; for( i; i<vps && a<b && vp[i].first<b ; ++i) { if(vp[i].first>=a) { e+=vp[i].first-a; if(-vp[i].second<=b) wynik=max(wynik, rek(i) ); } a=max(a,-vp[i].second); } if(a<b) e+=b-a; wynik=max(wynik,e); return wynik; } long long licz() { sort(v.begin(), v.end()); sort(vp.begin(), vp.end()); long long wynik=0,a=0,b,c,d,e=0; b=vp.size(); vps=b; for(int i=0; i<b; ++i) { if(vp[i].first>=a) { e+=vp[i].first-a; wynik=max(wynik, rek(i) ); } a=max(a,-vp[i].second); } e+=v[v.size()-1]-a; wynik=max(wynik,e); for(int i=v.size()-1; i>0; --i) wynik=max(wynik, v[i]-v[i-1] ); a=0; for(int i=0; i<b; ++i) { while(v[a]<=vp[i].first) ++a; if(-vp[i].second==v[a]) { e=i; c=a-1; d=a; while( e>=0 && vp[e].first==v[c] && -vp[e].second==v[d]) { wynik=max(wynik, v[d+1]-v[d]+v[c]-v[c-1] ); --e; --c; ++d; } } } return wynik; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin>>n>>X>>Y; v.push_back(0); v2.push_back(0); for(int i=0; i<n; ++i) { cin>>q>>w>>e>>r; if(q>e) swap(q,e); if(w>r) swap(w,r); v.push_back(q); v.push_back(e); v2.push_back(w); v2.push_back(r); vp.push_back({q,-e}); vp2.push_back({w,-r}); } v.push_back(X); v2.push_back(Y); odp=licz(); for(int i=v.size()-1; i>=0; --i) v[i]=v2[i]; for(int i=vp.size()-1; i>=0; --i) { vp[i].first=vp2[i].first; vp[i].second=vp2[i].second; } odp*=licz(); cout<<odp; return 0; } |
English