#include<cstdio> #include<algorithm> using namespace std; const int N=500010,M=2111111; int n,m,_,X,Y,i,j,x,y,e[N][4],a[N],b[N],c[N<<1],ans; int gl[N<<1],gr[N<<1],v[N<<1],nxt[N<<1],ed; int cov[N<<1],mi[M],val[M],tag[M]; inline void add(int&x,int y){v[++ed]=y;nxt[ed]=x;x=ed;} inline void tag1(int x,int p){mi[x]+=p;tag[x]+=p;} inline void up(int x){ if(mi[x<<1]<mi[x<<1|1]){ mi[x]=mi[x<<1]; val[x]=val[x<<1]; }else if(mi[x<<1]>mi[x<<1|1]){ mi[x]=mi[x<<1|1]; val[x]=val[x<<1|1]; }else{ mi[x]=mi[x<<1]; val[x]=val[x<<1]+val[x<<1|1]; } } void build(int x,int a,int b){ tag[x]=0; if(a==b){ mi[x]=cov[a]; val[x]=c[a+1]-c[a]; return; } int mid=(a+b)>>1; build(x<<1,a,mid),build(x<<1|1,mid+1,b); up(x); } void change(int x,int a,int b,int c,int d,int p){ if(c<=a&&b<=d){tag1(x,p);return;} if(tag[x])tag1(x<<1,tag[x]),tag1(x<<1|1,tag[x]),tag[x]=0; int mid=(a+b)>>1; if(c<=mid)change(x<<1,a,mid,c,d,p); if(d>mid)change(x<<1|1,mid+1,b,c,d,p); up(x); } int solve(int all){ c[1]=0; c[m=2]=all; for(i=1;i<=n;i++)c[++m]=a[i],c[++m]=b[i]; sort(c+1,c+m+1); for(_=0,i=1;i<=m;i++)if(i==1||c[i]>c[_])c[++_]=c[i]; m=_; for(i=1;i<=m;i++)gl[i]=gr[i]=cov[i]=0; ed=0; for(i=1;i<=n;i++){ x=a[i],y=b[i]; if(x>y)swap(x,y); x=lower_bound(c+1,c+m+1,x)-c; y=lower_bound(c+1,c+m+1,y)-c; a[i]=x; b[i]=y; add(gl[x],i); add(gr[y],i); //[x..y-1] cov[x]++; cov[y]--; } for(i=1;i<=m;i++)cov[i]+=cov[i-1]; ans=0; build(1,1,m-1); for(i=1;i<m;i++){ for(j=gl[i];j;j=nxt[j]){ change(1,1,m-1,a[v[j]],b[v[j]]-1,-2); change(1,1,m-1,1,m-1,1); } for(j=gr[i];j;j=nxt[j]){ change(1,1,m-1,a[v[j]],b[v[j]]-1,2); change(1,1,m-1,1,m-1,-1); } if(!mi[1])ans=max(ans,val[1]); } return ans; } int main(){ scanf("%d%d%d",&n,&X,&Y); for(i=1;i<=n;i++)scanf("%d%d%d%d",&e[i][0],&e[i][1],&e[i][2],&e[i][3]); for(i=1;i<=n;i++)a[i]=e[i][0],b[i]=e[i][2]; int ansx=solve(X); for(i=1;i<=n;i++)a[i]=e[i][1],b[i]=e[i][3]; int ansy=solve(Y); printf("%lld",1LL*ansx*ansy); }
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 | #include<cstdio> #include<algorithm> using namespace std; const int N=500010,M=2111111; int n,m,_,X,Y,i,j,x,y,e[N][4],a[N],b[N],c[N<<1],ans; int gl[N<<1],gr[N<<1],v[N<<1],nxt[N<<1],ed; int cov[N<<1],mi[M],val[M],tag[M]; inline void add(int&x,int y){v[++ed]=y;nxt[ed]=x;x=ed;} inline void tag1(int x,int p){mi[x]+=p;tag[x]+=p;} inline void up(int x){ if(mi[x<<1]<mi[x<<1|1]){ mi[x]=mi[x<<1]; val[x]=val[x<<1]; }else if(mi[x<<1]>mi[x<<1|1]){ mi[x]=mi[x<<1|1]; val[x]=val[x<<1|1]; }else{ mi[x]=mi[x<<1]; val[x]=val[x<<1]+val[x<<1|1]; } } void build(int x,int a,int b){ tag[x]=0; if(a==b){ mi[x]=cov[a]; val[x]=c[a+1]-c[a]; return; } int mid=(a+b)>>1; build(x<<1,a,mid),build(x<<1|1,mid+1,b); up(x); } void change(int x,int a,int b,int c,int d,int p){ if(c<=a&&b<=d){tag1(x,p);return;} if(tag[x])tag1(x<<1,tag[x]),tag1(x<<1|1,tag[x]),tag[x]=0; int mid=(a+b)>>1; if(c<=mid)change(x<<1,a,mid,c,d,p); if(d>mid)change(x<<1|1,mid+1,b,c,d,p); up(x); } int solve(int all){ c[1]=0; c[m=2]=all; for(i=1;i<=n;i++)c[++m]=a[i],c[++m]=b[i]; sort(c+1,c+m+1); for(_=0,i=1;i<=m;i++)if(i==1||c[i]>c[_])c[++_]=c[i]; m=_; for(i=1;i<=m;i++)gl[i]=gr[i]=cov[i]=0; ed=0; for(i=1;i<=n;i++){ x=a[i],y=b[i]; if(x>y)swap(x,y); x=lower_bound(c+1,c+m+1,x)-c; y=lower_bound(c+1,c+m+1,y)-c; a[i]=x; b[i]=y; add(gl[x],i); add(gr[y],i); //[x..y-1] cov[x]++; cov[y]--; } for(i=1;i<=m;i++)cov[i]+=cov[i-1]; ans=0; build(1,1,m-1); for(i=1;i<m;i++){ for(j=gl[i];j;j=nxt[j]){ change(1,1,m-1,a[v[j]],b[v[j]]-1,-2); change(1,1,m-1,1,m-1,1); } for(j=gr[i];j;j=nxt[j]){ change(1,1,m-1,a[v[j]],b[v[j]]-1,2); change(1,1,m-1,1,m-1,-1); } if(!mi[1])ans=max(ans,val[1]); } return ans; } int main(){ scanf("%d%d%d",&n,&X,&Y); for(i=1;i<=n;i++)scanf("%d%d%d%d",&e[i][0],&e[i][1],&e[i][2],&e[i][3]); for(i=1;i<=n;i++)a[i]=e[i][0],b[i]=e[i][2]; int ansx=solve(X); for(i=1;i<=n;i++)a[i]=e[i][1],b[i]=e[i][3]; int ansy=solve(Y); printf("%lld",1LL*ansx*ansy); } |