题目链接:http://poj.org/problem?id=1151

很经典的题目,网上有很多模板代码,自己理解了一天,然后很容易就敲出来了。。。

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define maxn 110
using namespace std;
int n;
class node
{
public:
int l,r;//端点坐标的映射值(整数值)
double cnt;
double c;
double lf,rf;//实际的端点坐标
};
node segTree[maxn*];
class Line
{
public:
double x;
double y1;
double y2;
double f;//f=1表示左边,f=-1表示矩形的右边
};
Line line[maxn];
double y[maxn];
bool cmp(Line a, Line b)
{
return a.x < b.x;
}
void Build(int num, int l, int r)
{
segTree[num].l=l;
segTree[num].r=r;
segTree[num].cnt=segTree[num].c=;
segTree[num].lf=y[l];
segTree[num].rf=y[r];
if(l+==r) return ;
int mid=(l+r)/;
Build(num*,l,mid);
Build(num*+,mid,r);
}
void calen(int num)//计算边的有效长度
{
if(segTree[num].c > ) //表示当前边为直接有效部分 cnt存边的长度
{
segTree[num].cnt=segTree[num].rf-segTree[num].lf;
return ;
}
else//如果当前边不是直接有效部分 可以理解为当前边已经不存在
{
if(segTree[num].l+ ==segTree[num].r) //如果当前边为最小的单元(就是没有孩子了),那么其间接有效长度为0
{
segTree[num].cnt=;
}
else//否则其有效长度为孩子的有效长度和
{
segTree[num].cnt=segTree[num*].cnt+segTree[num*+].cnt;
return ;
} }
}
void Update(int num,Line e)
{
if(segTree[num].lf== e.y1 && segTree[num].rf ==e.y2)
{
segTree[num].c+=e.f;
calen(num);
return ;
}
if(segTree[num*].rf>=e.y2) Update(num*,e);
else
if(segTree[num*+].lf<=e.y1) Update(num*+,e);
else
{
Line tmp=e;
tmp.y2=segTree[num*].rf;
Update(num*,tmp);
tmp=e;
tmp.y1=segTree[num*+].lf;
Update(num*+,tmp);
}
calen(num);
}
int main()
{
int iCase=;
double x1,x2,y1,y2;
while(scanf("%d",&n)!=EOF && n)
{
int t=;
for(int i=;i<=n;i++)
{
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
line[t].x=x1;
line[t].y1=y1;
line[t].y2=y2;
line[t].f=;
y[t]=y1;
t++;
line[t].x=x2;
line[t].y1=y1;
line[t].y2=y2;
line[t].f=-;
y[t]=y2;
t++;
}
sort(y+,y+t);
sort(line+,line+t,cmp);
Build(,,t-);
Update(,line[]);
double ans=;
for(int i=;i<t;i++)
{
ans+=segTree[].cnt*(line[i].x- line[i-].x);
Update(,line[i]);
//segTree[1].cnt是位于坐标line[i-1].x的最终的有效边长
}
printf("Test case #%d\nTotal explored area: %.2f\n\n",iCase++,ans); } return ;
}

poj1151 Atlanis 线段树+离散化求矩形面积的并的更多相关文章

  1. 【HDU 1542】Atlantis(线段树+离散化,矩形面积并)

    求矩形面积并,离散化加线段树. 扫描线法: 用平行x轴的直线扫,每次ans+=(下一个高度-当前高度)*当前覆盖的宽度. #include<algorithm> #include<c ...

  2. 扫描线 + 线段树 : 求矩形面积的并 ---- hnu : 12884 Area Coverage

    Area Coverage Time Limit: 10000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit user ...

  3. 2015 UESTC 数据结构专题E题 秋实大哥与家 线段树扫描线求矩形面积交

    E - 秋实大哥与家 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 De ...

  4. hdu1542 线段树扫描线求矩形面积的并

    题意:       给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路:       自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...

  5. hdu 1542&&poj 1151 Atlantis[线段树+扫描线求矩形面积的并]

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

  6. HDU 1542"Atlantis"(线段树+扫描线求矩形面积并)

    传送门 •题意 给你 n 矩形,每个矩形给出你 $(x_1,y_1),(x_2,y_2)$ 分别表示这个矩形的左下角和右上角坐标: 让你求这 n 个矩形并的面积: 其中 $x \leq 10^{5} ...

  7. hdu1828 线段树扫描线求矩形面积的周长

    题意:       给你n个矩形,问你这n个矩形所围成的图形的周长是多少. 思路:       线段树的扫描线简单应用,这个题目我用的方法比较笨,就是扫描两次,上下扫描,求出多边形的上下边长和,然后同 ...

  8. hdu1255 覆盖的面积 线段树+里离散化求矩形面积的交

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 求矩形面积的交的线段树题目,刚做了求并的题目,再做这个刚觉良好啊,只要再加一个表示覆盖次数大于1 ...

  9. HDU 1828“Picture”(线段树+扫描线求矩形周长并)

    传送门 •参考资料 [1]:算法总结:[线段树+扫描线]&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828) •题意 给你 n 个矩形,求矩形并的周长: •题解1(两次扫描线) 周 ...

随机推荐

  1. [Openfire]使用WebSocket建立Openfire的客户端

    近日工作闲暇之余,对IM系统产生了兴趣,转而研究了IM的内容.找了半天,知道比较流行的是Openfire的系统,Openfire有许多平台实现,由于我是做Web的,所以当然是希望寻找Web的实现.Op ...

  2. js中实现继承的几种方式

    首先我们了解,js中的继承是主要是由原型链实现的.那么什么是原型链呢? 由于每个实例中都有一个指向原型对象的指针,如果一个对象的原型对象,是另一个构造函数的实例,这个对象的原型对象就会指向另一个对象的 ...

  3. 读书笔记 effective C++ Item 40 明智而谨慎的使用多继承

    1. 多继承的两个阵营 当我们谈论到多继承(MI)的时候,C++委员会被分为两个基本阵营.一个阵营相信如果单继承是好的C++性质,那么多继承肯定会更好.另外一个阵营则争辩道单继承诚然是好的,但多继承太 ...

  4. Flash加载ini文件!

    这个帖子里有解决方案: http://bbs.9ria.com/thread-405128-1-1.html

  5. 7.Redis常用命令:ZSet

    Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中.它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联, ...

  6. 原生js轮播图

    //用原生js实现了一个简单的轮播图效果 <!DOCTYPE html><html> <head> <meta charset="UTF-8&quo ...

  7. 做一个完整的纯react-naitve安卓应用【从环境安装到应用发布】

    前提:从来没有写过android 跟 ios 应用,是一个小前端.前一段时间玩了一下 react-native 感觉还不错,应用代码还未开源. 环境: win7 成果:                 ...

  8. 人生第一次hash

    人生的第一次hash交给了模板题. 讲道理,还没有别人快排要快,就比暴力快那么一点... 难道我写的hash就那么菜么? 我想了想,光是处理字符串就O(n*len).. 这是hash的正确写法吗?我都 ...

  9. js中字符串转换为日期型

    简介:字符串转日期型函数 传入一个字符串格式的日期,如何转换为日期型的.以下为转换方案. //字符串转换为日期函数,返回日期型(传入的日期格式2014-04-22) function StringTo ...

  10. Spring+SpringMVC+MyBatis+easyUI整合优化篇(十)数据层优化-整合druid

    druid介绍 这是druid对自己的介绍: Druid是阿里开源的一个数据库连接池技术,号称自己是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.B ...