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
  • 相关阅读:
    badblocks 检查硬盘是否有坏道
    IE兼容性开发的笔记
    Linux下设置ip和主机名进行绑定
    netty httpserver
    netty websocket协议开发
    OAuth2.0和SSO授权的区别
    window.location.href跳转问题2
    修改密码,验证两次输入是否相同,相同才能提交
    (2)集合 遍历set集合
    (1)集合 ---遍历map集合
  • 原文地址:https://www.cnblogs.com/cenariusxz/p/6592198.html
Copyright © 2011-2022 走看看