1 #include<cstdio>
  2 #include<cstring>
  3 #include<cstdlib>
  4 #define MAXN 50010
  5 typedef __int64 LL;
  6 struct Line
  7 {
  8     int left,right,high,flag;
  9 };
 10 struct node
 11 {
 12     int cover,len;
 13 };
 14 Line p[MAXN<<3];
 15 node tree[MAXN<<5];
 16 int cnt,x[MAXN<<3];
 17 inline void Post(int x1,int y1,int x2,int y2)
 18 {
 19     if(x1!=x2&&y1!=y2)
 20     {
 21         x[cnt]=x1;
 22         p[cnt].left=x1;
 23         p[cnt].right=x2;
 24         p[cnt].high=y1;
 25         p[cnt++].flag=1;
 26         x[cnt]=x2;
 27         p[cnt].left=x1;
 28         p[cnt].right=x2;
 29         p[cnt].high=y2;
 30         p[cnt++].flag=-1;
 31     }
 32 }
 33 int cmp1(const void *a,const void *b)
 34 {
 35     return *(int *)a-*(int *)b;
 36 }
 37 int cmp2(const void *a,const void *b)
 38 {
 39     return (*(Line *)a).high-(*(Line *)b).high;
 40 }
 41 int Bin(int val,int low,int high)
 42 {
 43     int mid;
 44     while(low<high)
 45     {
 46         mid=(low+high)>>1;
 47         if(x[mid]==val)
 48             return mid;
 49         if(x[mid]<val)
 50             low=mid+1;
 51         else
 52             high=mid;
 53     }
 54 }
 55 void Build(int L,int R,int rt)
 56 {
 57     tree[rt].len=tree[rt].cover=0;
 58     if(L!=R)
 59     {
 60         int mid=(L+R)>>1;
 61         Build(L,mid,rt<<1);
 62         Build(mid+1,R,rt<<1|1);
 63     }
 64 }
 65 inline void PushUp(int L,int R,int rt)
 66 {
 67     if(tree[rt].cover)
 68         tree[rt].len=x[R+1]-x[L];
 69     else if(L==R)
 70         tree[rt].len=0;
 71     else
 72         tree[rt].len=tree[rt<<1].len+tree[rt<<1|1].len;
 73 }
 74 void Update(int st,int en,int flag,int L,int R,int rt)
 75 {
 76     if(st<=L&&R<=en)
 77     {
 78         tree[rt].cover+=flag;
 79         PushUp(L,R,rt);
 80     }
 81     else
 82     {
 83         int mid=(L+R)>>1;
 84         if(mid>=st)
 85             Update(st,en,flag,L,mid,rt<<1);
 86         if(en>mid)
 87             Update(st,en,flag,mid+1,R,rt<<1|1);
 88         PushUp(L,R,rt);
 89     }
 90 }
 91 int main()
 92 {
 93     LL ans;
 94     int i,n,m,st,en,x1,y1,x2,y2,x3,y3,x4,y4;
 95     while(scanf("%d",&n),n)
 96     {
 97         for(cnt=i=0;i<n;i++)
 98         {
 99             scanf("%d%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
100             Post(x1,y1,x2,y3);
101             Post(x1,y4,x2,y2);
102             Post(x1,y3,x3,y4);
103             Post(x4,y3,x2,y4);
104         }
105         qsort(x,cnt,sizeof(x[0]),cmp1);
106         qsort(p,cnt,sizeof(p[0]),cmp2);
107         for(i=m=0;i<cnt;i++)
108         {
109             if(x[i]!=x[m])
110                 x[++m]=x[i];
111         }
112         Build(0,m,1);
113         for(ans=i=0;i<cnt-1;i++)
114         {
115             st=Bin(p[i].left,0,m+1);
116             en=Bin(p[i].right,0,m+1);
117             Update(st,en-1,p[i].flag,0,m,1);
118             ans+=(LL)(p[i+1].high-p[i].high)*tree[1].len;
119         }
120         printf("%I64d\n",ans);
121     }
122     return 0;
123 }
posted on 2012-05-31 23:20  DrunBee  阅读(319)  评论(0编辑  收藏  举报