zoukankan      html  css  js  c++  java
  • 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
    ",cas);
    118         cas++;
    119         printf("Total explored area: %.2lf
    ",s);
    120         printf("
    ");
    121     }
    122     return 0;
    123 }
    View Code
  • 相关阅读:
    Python基础之公共方法
    Python基础之字符串
    Python基础之字典
    Python基础之元组
    Python基础之列表
    Python基础之函数和模块
    Python基础之if判断,while循环,循环嵌套
    Python基础之注释,算数运算符,变量,输入和格式化输出
    Mapreduce实例——二次排序
    Mapreduce实例——Reduce端join
  • 原文地址:https://www.cnblogs.com/fanminghui/p/3918920.html
Copyright © 2011-2022 走看看