1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 #define MAXN 5010 7 #define EPS 1e-8 8 using namespace std; 9 struct Line 10 { 11 double left,right,high; 12 int flag; 13 }; 14 struct node 15 { 16 int cover; 17 double one,more; 18 }; 19 node tree[MAXN<<2]; 20 Line p[MAXN]; 21 double x[MAXN]; 22 int cmp1(const void *a,const void *b) 23 { 24 return (*(Line *)a).high>(*(Line *)b).high?1:-1; 25 } 26 int cmp2(const void *a,const void *b) 27 { 28 return *(double *)a>*(double *)b?1:-1; 29 } 30 inline int dbcmp(double s,double t) 31 { 32 if(fabs(s-t)<EPS) 33 return 0; 34 return s>t?1:-1; 35 } 36 int Bin(double val,int low,int high) 37 { 38 int mid,temp; 39 while(low<high) 40 { 41 mid=(low+high)>>1; 42 temp=dbcmp(x[mid],val); 43 if(temp==0) 44 return mid; 45 if(temp>0) 46 high=mid; 47 else 48 low=mid+1; 49 } 50 } 51 inline void PushUp(int L,int R,int rt) 52 { 53 if(tree[rt].cover>1) 54 tree[rt].one=tree[rt].more=x[R+1]-x[L]; 55 else if(tree[rt].cover==1) 56 { 57 tree[rt].one=x[R+1]-x[L]; 58 if(L==R) 59 tree[rt].more=0; 60 else 61 tree[rt].more=tree[rt<<1].one+tree[rt<<1|1].one; 62 } 63 else 64 { 65 if(L==R) 66 tree[rt].more=tree[rt].one=0; 67 else 68 { 69 tree[rt].one=tree[rt<<1].one+tree[rt<<1|1].one; 70 tree[rt].more=tree[rt<<1].more+tree[rt<<1|1].more; 71 } 72 } 73 } 74 void Update(int s,int t,int val,int L,int R,int rt) 75 { 76 if(s<=L&&R<=t) 77 { 78 tree[rt].cover+=val; 79 PushUp(L,R,rt); 80 } 81 else 82 { 83 int mid=(L+R)>>1; 84 if(mid>=s) 85 Update(s,t,val,L,mid,rt<<1); 86 if(t>mid) 87 Update(s,t,val,mid+1,R,rt<<1|1); 88 PushUp(L,R,rt); 89 } 90 } 91 int main() 92 { 93 double ans,x1,y1,x2,y2; 94 int n,i,c,cnt,m,s,t; 95 scanf("%d",&c); 96 while(c--) 97 { 98 scanf("%d",&n); 99 for(i=cnt=0;i<n;i++) 100 { 101 scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); 102 if(dbcmp(x1,x2)==0||dbcmp(y1,y2)==0) 103 continue; 104 if(x1>x2) 105 swap(x1,x2); 106 if(y1>y2) 107 swap(y1,y2); 108 p[cnt].flag=1; 109 p[cnt].left=x1; 110 p[cnt].right=x2; 111 x[cnt]=x1; 112 p[cnt++].high=y1; 113 p[cnt].flag=-1; 114 p[cnt].left=x1; 115 p[cnt].right=x2; 116 x[cnt]=x2; 117 p[cnt++].high=y2; 118 } 119 qsort(p,cnt,sizeof(p[0]),cmp1); 120 qsort(x,cnt,sizeof(x[0]),cmp2); 121 for(i=m=0;i<cnt;i++) 122 { 123 if(dbcmp(x[m],x[i])) 124 x[++m]=x[i]; 125 } 126 m++; 127 memset(tree,0,sizeof(tree)); 128 for(ans=i=0;i<cnt-1;i++) 129 { 130 s=Bin(p[i].left,0,m); 131 t=Bin(p[i].right,0,m); 132 Update(s,t-1,p[i].flag,0,m-2,1); 133 ans+=(p[i+1].high-p[i].high)*tree[1].more; 134 } 135 printf("%.2lf\n",ans); 136 } 137 return 0; 138 }
![](https://img2024.cnblogs.com/blog/35695/202502/35695-20250207193705881-1356327967.jpg)