本人思路: 先对x轴和y轴离散化,然后差分后前缀和求出原图(疯狂容斥一波)最后对每一个x所在列计算面积为h,一旦下一列和本列不一样,ans+=size(宽度)* sy(每一列的高度),然后size清零以此类推 不是tle,是wa
#include<bits/stdc++.h>
#define M 4096
#define lb lower_bound
using namespace std;
struct place{
int x1,y1,x2,y2;
}p[M];
struct xlr {int l,r;} len[M];
int x[M],y[M];
long long n,ans=0;
int chf[M][M],sum[M][M];
int main(){
scanf("%lld",&n);
for(int i=1;i<=n;++i){
int x1,x2,y1,y2;
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
p[i].x1=min(x1,x2), p[i].y1=min(y1,y2);
p[i].x2=max(x1,x2), p[i].y2=max(y1,y2);
x[i]=p[i].x1, x[n+i]=p[i].x2;
y[i]=p[i].y1, y[n+i]=p[i].y2;
len[i].l=p[i].x1, len[i].r=p[i].x2;
}
sort(x+1,x+2*n+1);sort(y+1,y+2*n+1);
auto kx=unique(x+1,x+2*n+1);
auto ky=unique(y+1,y+2*n+1);
for(int i=1;i<=n;++i){
int x1n,y1n,x2n,y2n;
x1n=lb(x+1,kx,p[i].x1)-x;
x2n=lb(x+1,kx,p[i].x2)-x;
y1n=lb(y+1,ky,p[i].y1)-y;
y2n=lb(y+1,ky,p[i].y2)-y;
chf[y1n][x1n]++;chf[y2n][x2n]++;
chf[y1n][x2n]--;chf[y2n][x1n]--;
}
for(int i=1;i<ky-y;++i)
for(int j=1;j<kx-x;++j)
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+chf[i][j];
int sy=0,syl,size=0;
for(int i=1;i<kx-x;++i){
syl=sy;
sy=0;
int yl,yr;
for(int j=1;j<ky-y;++j){
if(sum[j][i] && !sum[j-1][i]) yl=j;
if(sum[j][i] && !sum[j+1][i]){
yr=j+1;
sy+=y[yr]-y[yl];
}
}
if(sy==syl){
size+=x[i]-x[i-1];
}
else{
size+=x[i]-x[i-1];
ans+=size*syl;
size=0;
}
}
cout<<ans;
return 0;
}