<span style="font-size:18px;">#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=55555;
#define lson i*2,l,m
#define rson i*2+1,m+1,r
int cnt[MAXN*4],sum[MAXN*4];
struct node
{
int l,r,h,d;
node(){}
node(int a,int b,int c,int d):l(a),r(b),h(c),d(d){}
bool operator < (const node & b)const
{
if (h == b.h) return d > b.d;//这句话不写也AC,但是还是写上保险,对于本题来说写不写没区别
return h<b.h;
}
}nodes[MAXN*8];
void PushUp(int i,int l,int r)
{
if(cnt[i])
sum[i]=r-l+1;
else if(l==r)
sum[i]=0;
else
sum[i]=sum[i*2]+sum[i*2+1];
}
void build(int i,int l,int r)
{
cnt[i]=0;
sum[i]=0;
if(l==r)
return ;
int m=(l+r)>>1;
build(lson);
build(rson);
//PushUp(i,l,r);
}
void update(int ql,int qr,int v,int i,int l,int r)
{
if(ql<=l&&r<=qr)
{
cnt[i]+=v;
PushUp(i,l,r);
return ;
}
int m=(l+r)>>1;//这里一定小心,如果是m=(l+r)/2,会无限递归,栈溢出,如ql=qr=-1且l=-1,r=0的时候
if(ql<=m) update(ql,qr,v,lson);
if(m<qr) update(ql,qr,v,rson);
PushUp(i,l,r);
}
int main()
{
int t;
while(scanf("%d",&t)==1&&t)
{
int m=0;
int lbd=50000,rbd=0;
for(int i=1;i<=t;i++)
{
int x1,y1,x2,y2,x3,y3,x4,y4;
scanf("%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
lbd=min(lbd,x1);
rbd=max(rbd,x2);
nodes[++m]= node(x1,x3,y1,1);
nodes[++m]= node(x1,x3,y2,-1);
nodes[++m]= node(x4,x2,y1,1);
nodes[++m]= node(x4,x2,y2,-1);
nodes[++m]= node(x3,x4,y1,1);
nodes[++m]= node(x3,x4,y3,-1);
nodes[++m]= node(x3,x4,y4,1);
nodes[++m]= node(x3,x4,y2,-1);
}
sort(nodes+1,nodes+m+1);
build(1,lbd,rbd-1);
long long ans=0;
for(int i=1;i<m;i++)
{
int ql=nodes[i].l;
int qr=nodes[i].r-1;
if(ql<=qr)update(ql,qr,nodes[i].d,1,lbd,rbd-1);
ans+= (long long)sum[1]*(nodes[i+1].h-nodes[i].h);
}
printf("%I64d\n",ans);
}
}
</span>
求矩形面积且矩形是镂空的
猜你喜欢
转载自blog.csdn.net/qq_40859951/article/details/84192102
今日推荐
周排行