求矩形的面积之和。

线段树+离散话+扫描线

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<iomanip>
#define INF 99999999
using namespace std; const int MAX=+;
int mark[MAX<<];//记录某个区间的下底边个数
double sum[MAX<<];//记录某个区间的下底边总长度
double lisan[MAX];//对x进行离散化,否则x为浮点数且很大无法进行线段树 //以横坐标作为线段(区间),对横坐标线段进行扫描
//扫描的作用是每次更新下底边总长度和下底边个数,增加新面积
struct seg{//线段
double l,r,h;
int d;
seg(){}
seg(double x1,double x2,double H,int c):l(x1),r(x2),h(H),d(c){}
bool operator<(const seg &a)const{
return h<a.h;
}
}s[MAX]; void Upfather(int n,int left,int right){
if(mark[n])sum[n]=lisan[right+]-lisan[left];//表示该区间整个线段长度可以作为底边
else if(left == right)sum[n]=;//叶子结点则底边长度为0(区间内线段长度为0)
else sum[n]=sum[n<<]+sum[n<<|];
} void Update(int L,int R,int d,int n,int left,int right){
if(L<=left && right<=R){//该区间是当前扫描线段的一部分,则该区间下底边总长以及上下底边个数差更新
mark[n]+=d;//更新底边相差差个数
Upfather(n,left,right);//更新底边长
return;
}
int mid=left+right>>;
if(L<=mid)Update(L,R,d,n<<,left,mid);
if(R>mid)Update(L,R,d,n<<|,mid+,right);
Upfather(n,left,right);
} int search(double key,double* x,int n){
int left=,right=n-;
while(left<=right){
int mid=left+right>>;
if(x[mid] == key)return mid;
if(x[mid]>key)right=mid-;
else left=mid+;
}
return -;
} int main(){
int n,num=;
double x1,x2,y1,y2;
while(cin>>n,n){
int k=;
for(int i=;i<n;++i){
cin>>x1>>y1>>x2>>y2;
lisan[k]=x1;
s[k++]=seg(x1,x2,y1,);
lisan[k]=x2;
s[k++]=seg(x1,x2,y2,-);
}
sort(lisan,lisan+k);
sort(s,s+k);
int m=;
for(int i=;i<k;++i)//去重复端点
if(lisan[i] != lisan[i-])lisan[m++]=lisan[i];
double ans=;
//memset(mark,0,sizeof mark);
//memset(sum,0,sizeof sum);//如果下面是i<k-1,则要初始化,因为如果对第k-1条,线段扫描时会使得mark,sum为0才不用初始化的
for(int i=;i<k;++i){//扫描线段
int L=search(s[i].l,lisan,m);
int R=search(s[i].r,lisan,m)-;
Update(L,R,s[i].d,,,m-);//扫描线段时更新底边长度和底边相差个数
ans+=sum[]*(s[i+].h-s[i].h);//新增加面积
}
printf("Test case #%d\nTotal explored area: %.2lf\n\n",++num,ans);
}
return ;
}

hdu 1542 Atlantis的更多相关文章

  1. (HDU 1542) Atlantis 矩形面积并——扫描线

    n个矩形,可以重叠,求面积并. n<=100: 暴力模拟扫描线.模拟赛大水题.(n^2) 甚至网上一种“分块”:分成n^2块,每一块看是否属于一个矩形. 甚至这个题就可以这么做. n<=1 ...

  2. HDU 1542 Atlantis(矩形面积并)

    HDU 1542 Atlantis 题目链接 题意:给定一些矩形,求面积并 思路:利用扫描线,因为这题矩形个数不多,直接暴力扫就能够了.假设数据大.就要用线段树 代码: #include <cs ...

  3. HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  4. HDU 1542 - Atlantis - [线段树+扫描线]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

  5. HDU 1542 Atlantis(扫描线算法)

    题意:给出n个矩形的左下角左边和右上角坐标,求这n个矩形的面积并 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1542 典型的扫描线算法的题目 什么是 ...

  6. hdu 1542 Atlantis(线段树,扫描线)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  7. hdu 1542 Atlantis(段树&amp;扫描线&amp;面积和)

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  8. hdu 1542 Atlantis 段树区,并寻求,,,尼玛真坑人数据,不要打开一小阵!

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  9. (中等) HDU 1542 Atlantis,扫描线。

    Problem Description There are several ancient Greek texts that contain descriptions of the fabled is ...

  10. HDU 1542 Atlantis(线段树面积并)

     描述 There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. S ...

随机推荐

  1. 设置groupBox背景透明

    步骤:属性-BackColor-WEB面板-Transparent

  2. C++-继承名称的掩盖

    /////////////////////////////////////////////////////////////////////////////// // // FileName : eff ...

  3. C-指针和数组的区别

    指针的操作: 允许:1)同类型指针的赋值 2)与整形的加减运算 3)指向同一数组内指针的减运算和比较 4)赋 ‘0’ 或与 ‘0’ 比较 不允许:1)两指针的相加,相乘除,位移或mask 2)与flo ...

  4. const的全面理解

    const关键字用来作甚?const是一个类型修饰符.常见的类型修饰符有哪些? short long unsigned signed static autoextern register 定义一个变量 ...

  5. JSON.parse()和eval()区别

    JSON.parse()只会将标准的Json字符串(key和value都由双引号引起来,最外面用单引号括住)转为JSON对象. eval()在转换字符串的时候是比较松的,即使不是标准的Json字符串也 ...

  6. 推荐一款作图神器:ProcessOn

    本人近日发现一款作图神器:ProcessOn 它是一款在线的作图工具,完全国产,前台是用HTML5  Canvas加javascript做绘图,后台用java实现数据处理和图片生成, 整站UI基本类似 ...

  7. 番茄工作法和Bullet Journal笔记法

    番茄工作法是一套时间管理方法,Bullet journal是一套笔记记录的方法,最近通过学习这2个方法来管理自己的时间,让自己战胜拖延症. 番茄工作法 番茄工作法的整体思路就是将时间分割成一个个小时间 ...

  8. 利用ps指令查看某个程序的进程状态

    ps -ef是查看所有的进程,然后用grep筛选出你要的信息. eg.

  9. springMVC文件上传(转)

    原文链接: http://www.cnblogs.com/lonecloud/p/5989905.html 在Spring-mvc.xml注入bean 1 <!-- 配置文件上传,如果没有使用文 ...

  10. DetectEncoding

    private Encoding DetectEncoding(ref Stream stream) { if (_pageEncoding != null) { return _pageEncodi ...