zoukankan      html  css  js  c++  java
  • hdu1542 Atlantis 线段树--扫描线求面积并

    There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the island. But unfortunately, these maps describe different regions of Atlantis. Your friend Bill has to know the total area for which maps exist. You (unwisely) volunteered to write a program that calculates this quantity.

    题意:给出若干个矩形,求他们的总面积,即矩形的面积并

    求面积并是线段树-扫描线的裸题

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<algorithm>
     4 #include<math.h>
     5 using namespace std;
     6 const int maxm=20005;
     7 
     8 int cov[maxm<<2];
     9 double y[maxm],st[maxm];
    10 
    11 struct seg{
    12     double x,y1,y2;
    13     int c;
    14     bool operator < (const seg a)const{
    15         return x<a.x;
    16     }
    17 }s[maxm];
    18 
    19 void pushup(int o,int l,int r){
    20     if(cov[o]>0)st[o]=y[r]-y[l];
    21     else if(cov[o]==0){
    22         if(l+1==r)st[o]=0;
    23         else st[o]=st[o<<1]+st[o<<1|1];
    24     }
    25 }
    26 
    27 void update(int o,int l,int r,seg a){
    28     if(a.y1<=y[l]&&a.y2>=y[r]){
    29         cov[o]+=a.c;
    30         pushup(o,l,r);
    31         return;
    32     }
    33     if(l+1==r)return;
    34     int m=l+((r-l)>>1);
    35     if(a.y1<y[m])update(o<<1,l,m,a);
    36     if(a.y2>y[m])update(o<<1|1,m,r,a);
    37     pushup(o,l,r);
    38 }
    39 
    40 int main(){
    41     int n;
    42     int c=0;
    43     while(scanf("%d",&n)!=EOF&&n){
    44         memset(st,0,sizeof(st));
    45         memset(cov,0,sizeof(cov));
    46         for(int i=1;i<=n;++i){
    47             double x1,y1,x2,y2;
    48             scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
    49             s[2*i-1].x=x1;s[2*i-1].y1=y1;s[2*i-1].y2=y2;s[2*i-1].c=1;
    50             y[2*i-1]=y1;
    51             s[2*i].x=x2;s[2*i].y1=y1;s[2*i].y2=y2;s[2*i].c=-1;
    52             y[2*i]=y2;
    53         }
    54         sort(s+1,s+2*n+1);
    55         sort(y+1,y+2*n+1);
    56         double ans=0;
    57         int cnt=1;
    58         for(int i=2;i<=2*n;++i){
    59             if(y[i]!=y[i-1])y[++cnt]=y[i];
    60         }
    61         for(int i=1;i<2*n;++i){
    62             update(1,1,cnt,s[i]);
    63             ans+=st[1]*(s[i+1].x-s[i].x);
    64         }
    65         printf("Test case #%d
    ",++c);
    66         printf("Total explored area: %.2lf
    
    ",ans);
    67     }
    68     return 0;
    69 }
    View Code
  • 相关阅读:
    面向对象SOLID原则-设计模式-第2篇
    python 设计模式 开篇 第1篇
    区块链 第1篇 什么是区块链 区块链与比特币的关系 区块链的发展历史 应用领域
    HTTP协议六种请求:GET,HEAD,PUT,DELETE,POST
    python垃圾回收机制
    类的MRO属性 C3算法
    Vue第六篇 element-ui 项目管理工具npm webpack 启Vue项目vue-cli
    《EffctiveJava》泛型
    Kafka总结
    Windows 关闭端口号
  • 原文地址:https://www.cnblogs.com/cenariusxz/p/6592198.html
Copyright © 2011-2022 走看看