#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
struct punkt{
int wsp,kolor;
};
const int mx=1e6+5;
const long long mod=2877629297581607;
punkt tabx[mx],taby[mx];
long long pot[mx];
int strona[mx];
long long wynx,wyny,wyn,hasz;
int n,x,y,xp,xk,yp,yk,ile_dodac,skad;
map<long long,int>mapa;
long long najdluzszy(punkt* tx,int dlugosc){
for(int i=0;i<n;++i)strona[i]=0;
hasz=0;
mapa.clear();
for(int i=1;i<n;++i){
ile_dodac=tx[i].wsp-tx[i-1].wsp;
skad=tx[i].kolor;
if(ile_dodac!=0){
mapa[hasz]+=ile_dodac;
}
if(strona[skad]==0){
strona[skad]=1;
hasz+=pot[skad];
if(hasz>=mod)hasz-=mod;
}
else{
strona[skad]=0;
hasz-=pot[skad];
if(hasz<0)hasz+=mod;
}
}
ile_dodac=tx[0].wsp+dlugosc-tx[n-1].wsp;
skad=tx[0].kolor;
if(ile_dodac!=0)mapa[hasz]+=ile_dodac;
long long wyn=0;
for(auto it=mapa.begin();it!=mapa.end();++it){
int akt=(*it).second;
if(akt>wyn)wyn=akt;
}
return wyn;
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>x>>y;
for(int i=0;i<n;++i){
cin>>xp>>yp>>xk>>yk;
tabx[2*i]={xp,i};
tabx[2*i+1]={xk,i};
taby[2*i]={yp,i};
taby[2*i+1]={yk,i};
}
n*=2;
pot[0]=1;
for(int i=1;i<n;++i){
pot[i]=29*pot[i-1];
pot[i]%=mod;
}
sort(tabx,tabx+n,[](punkt a,punkt b){return a.wsp<b.wsp;});
sort(taby,taby+n,[](punkt a,punkt b){return a.wsp<b.wsp;});
wynx=najdluzszy(tabx,x);
wyny=najdluzszy(taby,y);
wyn=wynx*wyny;
cout<<wyn;
}
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 | #include<iostream> #include<map> #include<algorithm> using namespace std; struct punkt{ int wsp,kolor; }; const int mx=1e6+5; const long long mod=2877629297581607; punkt tabx[mx],taby[mx]; long long pot[mx]; int strona[mx]; long long wynx,wyny,wyn,hasz; int n,x,y,xp,xk,yp,yk,ile_dodac,skad; map<long long,int>mapa; long long najdluzszy(punkt* tx,int dlugosc){ for(int i=0;i<n;++i)strona[i]=0; hasz=0; mapa.clear(); for(int i=1;i<n;++i){ ile_dodac=tx[i].wsp-tx[i-1].wsp; skad=tx[i].kolor; if(ile_dodac!=0){ mapa[hasz]+=ile_dodac; } if(strona[skad]==0){ strona[skad]=1; hasz+=pot[skad]; if(hasz>=mod)hasz-=mod; } else{ strona[skad]=0; hasz-=pot[skad]; if(hasz<0)hasz+=mod; } } ile_dodac=tx[0].wsp+dlugosc-tx[n-1].wsp; skad=tx[0].kolor; if(ile_dodac!=0)mapa[hasz]+=ile_dodac; long long wyn=0; for(auto it=mapa.begin();it!=mapa.end();++it){ int akt=(*it).second; if(akt>wyn)wyn=akt; } return wyn; } int main(){ ios::sync_with_stdio(false); cin>>n>>x>>y; for(int i=0;i<n;++i){ cin>>xp>>yp>>xk>>yk; tabx[2*i]={xp,i}; tabx[2*i+1]={xk,i}; taby[2*i]={yp,i}; taby[2*i+1]={yk,i}; } n*=2; pot[0]=1; for(int i=1;i<n;++i){ pot[i]=29*pot[i-1]; pot[i]%=mod; } sort(tabx,tabx+n,[](punkt a,punkt b){return a.wsp<b.wsp;}); sort(taby,taby+n,[](punkt a,punkt b){return a.wsp<b.wsp;}); wynx=najdluzszy(tabx,x); wyny=najdluzszy(taby,y); wyn=wynx*wyny; cout<<wyn; } |
English