hdu 1255 覆盖的面积
http://acm.hdu.edu.cn/showproblem.php?pid=1255
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 100010 5 using namespace std; 6 7 int t,n; 8 double Y[maxn],X[maxn]; 9 struct point 10 { 11 double x; 12 double y_up; 13 double y_down; 14 int lr; 15 bool operator <(const point &a) const 16 { 17 return x<a.x; 18 } 19 }p[maxn*4]; 20 21 struct node 22 { 23 double x; 24 double y_up; 25 double y_down; 26 int cover; 27 bool flag; 28 }tree[maxn*4]; 29 30 void build(int i,int l,int r) 31 { 32 tree[i].x=-1; 33 tree[i].y_up=Y[r]; 34 tree[i].y_down=Y[l]; 35 tree[i].cover=0; 36 tree[i].flag=true; 37 if(l+1==r) 38 { 39 tree[i].flag=false; 40 return ; 41 } 42 int mid=(l+r)>>1; 43 build(i<<1,l,mid); 44 build(i<<1|1,mid,r); 45 } 46 47 double update(int i,double l,double r,double x,int lr) 48 { 49 if(tree[i].y_down>=r||tree[i].y_up<=l) return 0; 50 if(!tree[i].flag) 51 { 52 if(tree[i].cover>1) 53 { 54 tree[i].cover+=lr; 55 double sum=(x-tree[i].x)*(tree[i].y_up-tree[i].y_down); 56 tree[i].x=x; 57 return sum; 58 } 59 else 60 { 61 tree[i].cover+=lr; 62 tree[i].x=x; 63 return 0; 64 } 65 } 66 else return update(i<<1,l,r,x,lr)+update(i<<1|1,l,r,x,lr); 67 } 68 int main() 69 { 70 scanf("%d",&t); 71 while(t--) 72 { 73 scanf("%d",&n); 74 int cnt=0; 75 for(int i=1; i<=n; i++) 76 { 77 double x1,y1,x2,y2; 78 scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); 79 p[cnt].x=x1; 80 p[cnt].y_down=y1; 81 p[cnt].y_up=y2; 82 p[cnt].lr=1; 83 X[cnt]=x1; 84 Y[cnt++]=y1; 85 p[cnt].x=x2; 86 p[cnt].y_down=y1; 87 p[cnt].y_up=y2; 88 X[cnt]=x2; 89 p[cnt].lr=-1; 90 Y[cnt++]=y2; 91 } 92 sort(Y,Y+cnt); 93 sort(X,X+cnt); 94 sort(p,p+cnt); 95 build(1,0,cnt-1); 96 double ans=0; 97 for(int i=0; i<cnt; i++) 98 { 99 ans+=update(1,p[i].y_down,p[i].y_up,p[i].x,p[i].lr); 100 } 101 printf("%.2lf\n",ans); 102 } 103 return 0; 104 }