矩形面积并,一个拆成四个
#include<cstdio> #include<cstring> #include<cmath> #include<map> #include<algorithm> using namespace std; const long long maxn=100000+10; struct Seg { long long x; long long Y1,Y2;//离散化之后的坐标 long long flag; }s[8*maxn]; long long X1[8*maxn],X2[8*maxn],Y1[8*maxn],Y2[8*maxn]; map<long long ,long long>m; long long M[8*maxn];long long k; long long n,tot,N; long long sum,ans; struct SegTree { long long len; long long cover; } segTree[maxn*4]; bool cmp(const Seg&a,const Seg&b) { return a.x<b.x; } void lsh() { k=0; m.clear(); for(long long i=0; i<N; i++) { if(m[Y1[i]]==0) M[k++]=Y1[i],m[Y1[i]]=1; if(m[Y2[i]]==0) M[k++]=Y2[i],m[Y2[i]]=1; } sort(M,M+k); m.clear(); for(long long i=0; i<k; i++) m[M[i]]=i; } void build(long long l,long long r,long long rt) { segTree[rt].cover=0; segTree[rt].len=0; if(l==r) return; long long m=(l+r)/2; build(l,m,2*rt); build(m+1,r,2*rt+1); } void pushUp(long long rt,long long l,long long r) { if(segTree[rt].cover) segTree[rt].len=M[r]-M[l-1]; else segTree[rt].len=segTree[2*rt].len+segTree[2*rt+1].len; } void update(long long info,long long L,long long R,long long l,long long r,long long rt) { if(L<=l&&r<=R) { segTree[rt].cover=segTree[rt].cover+info; pushUp(rt,l,r); return; } long long m=(l+r)/2; if(L<=m) update(info,L,R,l,m,2*rt); if(R>m) update(info,L,R,m+1,r,2*rt+1); pushUp(rt,l,r); } int main() { while(~scanf("%lld",&n)) { if(n==0) break; N=0; for(long long i=1; i<=n; i++) { long long a1,a2,a3,a4,b1,b2,b3,b4; scanf("%lld%lld%lld%lld%lld%lld%lld%lld",&a1,&b1,&a2,&b2,&a3,&b3,&a4,&b4); if(b3>b1&&a2>a1){ X1[N]=a1,Y1[N]=b1; X2[N]=a2,Y2[N]=b3; N++;} if(b2>b4&&a2>a1){ X1[N]=a1,Y1[N]=b4; X2[N]=a2,Y2[N]=b2; N++;} if(a3>a1&&b4>b3){ X1[N]=a1,Y1[N]=b3; X2[N]=a3,Y2[N]=b4; N++;} if(a2>a4&&b4>b3){ X1[N]=a4,Y1[N]=b3; X2[N]=a2,Y2[N]=b4; N++;} } if(N==0) { printf("0 "); continue; } lsh(); tot=0; for(long long i=0; i<N; i++) { s[tot].x=X1[i],s[tot].Y1=m[Y1[i]],s[tot].Y2=m[Y2[i]],s[tot].flag=1,tot++; s[tot].x=X2[i],s[tot].Y1=m[Y1[i]],s[tot].Y2=m[Y2[i]],s[tot].flag=-1,tot++; } sort(s,s+tot,cmp); ans=0; build(1,k,1); update(s[0].flag,s[0].Y1+1,s[0].Y2,1,k,1); for(long long i=1; i<tot; i++) { sum=segTree[1].len; ans=ans+sum*(s[i].x-s[i-1].x); update(s[i].flag,s[i].Y1+1,s[i].Y2,1,k,1); } printf("%lld ",ans); } return 0; }