zoukankan      html  css  js  c++  java
  • 【HDU】1542 Atlantis

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<cstdlib>
      4 #include<cmath>
      5 #define EPS 1e-9
      6 #define MAXN 210
      7 struct Line
      8 {
      9     double left,right,high;
     10     int flag;
     11 };
     12 struct node
     13 {
     14     int cover;
     15     double len;
     16 };
     17 node tree[MAXN<<2];
     18 Line p[MAXN];
     19 double x[MAXN];
     20 int cmp1(const void *a,const void *b)
     21 {
     22     return (*(Line *)a).high>(*(Line *)b).high?1:-1;
     23 }
     24 int cmp2(const void *a,const void *b)
     25 {
     26     return *(double *)a>*(double *)b?1:-1;
     27 }
     28 bool Equal(double x,double y)
     29 {
     30     return fabs(x-y)<EPS;
     31 }
     32 void Build(int L,int R,int rt)
     33 {
     34     tree[rt].cover=0;
     35     tree[rt].len=0;
     36     if(L!=R)
     37     {
     38         int mid=(L+R)>>1;
     39         Build(L,mid,rt<<1);
     40         Build(mid+1,R,rt<<1|1);
     41     }
     42 }
     43 int Bin(double val,int low,int high)
     44 {
     45     int mid;
     46     while(low<high)
     47     {
     48         mid=(low+high)>>1;
     49         if(Equal(val,x[mid]))
     50             return mid;
     51         if(val>x[mid])
     52             low=mid+1;
     53         else
     54             high=mid;
     55     }
     56 }
     57 inline void PushUp(int L,int R,int rt)
     58 {
     59     if(tree[rt].cover)
     60         tree[rt].len=x[R+1]-x[L];
     61     else if(L==R)
     62         tree[rt].len=0;
     63     else
     64         tree[rt].len=tree[rt<<1].len+tree[rt<<1|1].len;
     65 }
     66 void Update(int st,int en,int flag,int L,int R,int rt)
     67 {
     68     if(st<=L&&R<=en)
     69     {
     70         tree[rt].cover+=flag;
     71         PushUp(L,R,rt);
     72     }
     73     else
     74     {
     75         int mid=(L+R)>>1;
     76         if(mid>=st)
     77             Update(st,en,flag,L,mid,rt<<1);
     78         if(en>mid)
     79             Update(st,en,flag,mid+1,R,rt<<1|1);
     80         PushUp(L,R,rt);
     81     }
     82 }
     83 int main()
     84 {
     85     double x1,y1,x2,y2,ans;
     86     int n,m,i,k,u,v,ca=1;
     87     while(scanf("%d",&n),n)
     88     {
     89         for(i=k=0;i<n;i++)
     90         {
     91             scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
     92             x[k]=x1;
     93             p[k].flag=-1;
     94             p[k].left=x1;
     95             p[k].right=x2;
     96             p[k++].high=y2;
     97             x[k]=x2;
     98             p[k].flag=1;
     99             p[k].left=x1;
    100             p[k].right=x2;
    101             p[k++].high=y1;
    102         }
    103         qsort(p,k,sizeof(p[0]),cmp1);
    104         qsort(x,k,sizeof(x[0]),cmp2);
    105         for(m=i=0;i<k;i++)
    106         {
    107             if(!Equal(x[m],x[i]))
    108                 x[++m]=x[i];
    109         }
    110         Build(0,m-1,1);
    111         for(ans=i=0;i<k-1;i++)
    112         {
    113             u=Bin(p[i].left,0,m+1);
    114             v=Bin(p[i].right,0,m+1);
    115             Update(u,v-1,p[i].flag,0,m-1,1);
    116             ans+=(p[i+1].high-p[i].high)*tree[1].len;
    117         }
    118         printf("Test case #%d\nTotal explored area: %.2lf\n\n",ca++,ans);
    119     }
    120     return 0;
    121 }
    新博客:www.zhixiangli.com
  • 相关阅读:
    《DSP using MATLAB》Problem 6.17
    一些老物件
    《DSP using MATLAB》Problem 6.16
    《DSP using MATLAB》Problem 6.15
    《DSP using MATLAB》Problem 6.14
    《DSP using MATLAB》Problem 6.13
    《DSP using MATLAB》Problem 6.12
    《DSP using MATLAB》Problem 6.11
    P1414 又是毕业季II
    Trie树
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2528713.html
Copyright © 2011-2022 走看看