// 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; } |