hdu 1542 Atlantis
http://acm.hdu.edu.cn/showproblem.php?pid=1542
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 200000 5 using namespace std; 6 7 int n; 8 double Y[maxn],X[maxn]; 9 struct point 10 { 11 double x; 12 double y1; 13 double y2; 14 int lr; 15 bool operator <(const point &a)const 16 { 17 return x<a.x; 18 } 19 } p[maxn]; 20 21 struct node 22 { 23 int l,r; 24 double x; 25 double y1; 26 double y2; 27 int cover; 28 double len; 29 } tree[maxn*4]; 30 31 void build(int i,int l,int r) 32 { 33 tree[i].l=l; 34 tree[i].r=r; 35 tree[i].x=-1; 36 tree[i].y1=Y[l]; 37 tree[i].y2=Y[r]; 38 tree[i].cover=0; 39 tree[i].len=0; 40 if(l==r-1) return ; 41 int mid=(l+r)>>1; 42 build(i<<1,l,mid); 43 build(i<<1|1,mid,r); 44 } 45 46 void update(int i,double l,double r,int lr) 47 { 48 if(Y[tree[i].l]==l&&Y[tree[i].r]==r) 49 { 50 tree[i].cover+=lr; 51 if(tree[i].cover) 52 { 53 tree[i].len=Y[tree[i].r]-Y[tree[i].l]; 54 } 55 else if(tree[i].l==tree[i].r-1) tree[i].len=0; 56 else 57 tree[i].len=tree[i<<1].len+tree[i<<1|1].len; 58 return; 59 } 60 int mid=(tree[i].l+tree[i].r)>>1; 61 if(r<=Y[mid]) 62 { 63 update(i<<1,l,r,lr); 64 } 65 else if(l>=Y[mid]) 66 { 67 update(i<<1|1,l,r,lr); 68 } 69 else 70 { 71 update(i<<1,l,Y[mid],lr); 72 update(i<<1|1,Y[mid],r,lr); 73 } 74 if(tree[i].cover) 75 { 76 tree[i].len=Y[tree[i].r]-Y[tree[i].l]; 77 } 78 else if(tree[i].l==tree[i].r-1) tree[i].len=0; 79 else 80 tree[i].len=tree[i<<1].len+tree[i<<1|1].len; 81 } 82 83 int main() 84 { 85 int cas=1; 86 while(scanf("%d",&n)!=EOF) 87 { 88 if(n==0) break; 89 int t1=0; 90 for(int i=0; i<n; i++) 91 { 92 double x1,y1,x2,y2; 93 scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); 94 p[t1].x=x1; 95 p[t1].y1=y1; 96 p[t1].y2=y2; 97 p[t1].lr=1; 98 Y[t1++]=y1; 99 p[t1].x=x2; 100 p[t1].y1=y1; 101 p[t1].y2=y2; 102 p[t1].lr=-1; 103 Y[t1++]=y2; 104 } 105 sort(Y,Y+t1); 106 sort(p,p+t1); 107 int cnt=unique(Y,Y+t1)-Y; 108 build(1,0,cnt-1); 109 double x=0; 110 double s=0; 111 for(int i=0; i<t1; i++) 112 { 113 s+=(p[i].x-x)*tree[1].len; 114 update(1,p[i].y1,p[i].y2,p[i].lr); 115 x=p[i].x; 116 } 117 printf("Test case #%d\n",cas); 118 cas++; 119 printf("Total explored area: %.2lf\n",s); 120 printf("\n"); 121 } 122 return 0; 123 }