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 }
View Code

 

posted @ 2014-08-18 10:18  null1019  阅读(96)  评论(0编辑  收藏  举报