天呐,这算什么啊?
ans+=1ll*len[1]*(ss[i+1].x-ss[i].x);//这里忘了转成long long型了,结果改了一整晚,可是之前没碰过需要转的呀(不解,求解释),orz!!
半信半疑的改完提交了,结果真的过了,再把之前的代码改了一下,还是过了,郁闷!!!
题意:同样是求N个矩形的面积并,只不过,矩形中间存在一个空矩形……
最直观的方法就是将一个带空矩形的矩形分成四个矩形,再按照求面积并的方法求一遍就是了,需要离散化的
#include<iostream> #include<algorithm> #define maxn 200100 using namespace std; struct node { int x,y1,y2,s; node(int a=0,int b=0,int c=0,int d=0):x(a),y1(b),y2(c),s(d){} friend bool operator<(const node a,const node b) { return a.x<b.x; } }; bool cmp(node a,node b) { return a.x<b.x; } node ss[maxn*4]; struct node1 { int l,r; }p[maxn<<1]; int len[maxn<<1],cnt[maxn<<1]; int map1[maxn<<1]; void build(int k,int s,int t) { p[k].l=s; p[k].r=t; if(s==t) return ; int kl=k<<1,kr=kl+1,mid=(s+t)>>1; build(kl,s,mid); build(kr,mid+1,t); } void PushUp(int k) { if(cnt[k]) len[k]=map1[p[k].r+1]-map1[p[k].l]; else if(p[k].l==p[k].r) len[k]=0; else len[k]=len[k<<1]+len[k<<1|1]; } void update(int l,int r,int c,int k) { if(l<=p[k].l &&p[k].r<=r) { cnt[k]+=c; PushUp(k); return ; } int kl=k<<1,kr=kl+1,mid=(p[k].l+p[k].r)>>1; if(l<=mid) update(l,r,c,kl); if(r>mid) update(l,r,c,kr); PushUp(k); } int Bin(int key,int n,int map1[]) { int l = 0 , r = n - 1; while (l <= r) { int mid = (l + r) >> 1; if (map1[mid] == key) return mid; if (map1[mid] < key) l = mid + 1; else r = mid - 1; } return -1; } int main() { int n; int x1,x2,x3,x4,y1,y2,y3,y4; while(scanf("%d",&n)==1 &&n) { int m=0,cn=0; while(n--) { scanf("%d %d %d %d %d %d %d %d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4); ss[m++]=node(x1,y1,y2,1); ss[m++]=node(x3,y1,y2,-1); ss[m++]=node(x3,y4,y2,1); ss[m++]=node(x2,y4,y2,-1); ss[m++]=node(x4,y3,y4,1); ss[m++]=node(x2,y3,y4,-1); ss[m++]=node(x3,y1,y3,1); ss[m++]=node(x2,y1,y3,-1); map1[cn++]=y1;map1[cn++]=y2;map1[cn++]=y3;map1[cn++]=y4; } sort(ss,ss+m,cmp); sort(map1,map1+cn); int k=1; for (int i = 1 ; i < cn ; i ++) if (map1[i] != map1[i-1]) map1[k++] =map1[i]; memset(len,0,sizeof(len)); memset(cnt,0,sizeof(cnt)); build(1,0,k-1); __int64 ans=0; for(int i=0;i<m-1;i++) { int l=Bin(ss[i].y1,k,map1); int r=Bin(ss[i].y2,k,map1)-1; if(l<=r) update(l,r,ss[i].s,1); ans+=1ll*len[1]*(ss[i+1].x-ss[i].x); } printf("%I64d\n",ans); } return 0; }