题目链接: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. JD . 圆角矩形、权重层级、浮动撑开盒子及元素的默认间距、清除浮动、隐藏盒子、盒子的撑开与撑破、子盒子垂直居中|不占位置

    ---恢复内容开始--- 圆角矩形 border-radius:50%  40%  30%  33px:   像素.百分比.小数( 0.5 ) 左上.右上.右下.左下 权重: 标签 1 : 类选择器 ...

  2. c++学习笔记之封装篇(上)

    title: c++学习笔记之封装篇(上) date: 2017-03-12 18:59:01 tags: [c++,c,封装,类] categories: [学习,程序员,c/c++] --- 一. ...

  3. (转)KMP算法实现。超级赞!见过的最容易理解的

    网上有很多讲解KMP算法的博客,我就不浪费时间再写一份了.直接推荐一个当初我入门时看的博客吧:http://www.cnblogs.com/yjiyjige/p/3263858.html这位同学用详细 ...

  4. Tcl与Design Compiler (十三)——Design Compliler中常用到的命令(示例)总结

    本文如果有错,欢迎留言更正:此外,转载请标明出处 http://www.cnblogs.com/IClearner/  ,作者:IC_learner 本文将描述在Design Compliler中常用 ...

  5. 随机跳转页面之使用VBA公共变量

    p{ font-size: 15px; } .alexrootdiv>div{ background: #eeeeee; border: 1px solid #aaa; width: 99%; ...

  6. C语言编码风格_集锦_1

    参考原地址: http://www.jb51.net/article/79257.htm <一> 在一个标准的C语言程序中, 最特殊的莫过于main函数了. 函数大体上分为内联函数(C99 ...

  7. 利用php数组函数进行函数式编程

    因为一个BUG, 我在一个摇摇欲坠,几乎碰一下就会散架的项目中某一个角落中发现下面这样一段代码 这段程序与那个BUG有密切的关系. 我来回反复的捉摸这段代码, 发现这段代码实现了两个功能 第一个是在一 ...

  8. 微软在.NET官网上线.NET 架构指南频道

    微软在Visual Studio 2017 正式发布的时候也上线了一个参考应用https://github.com/dotnet/eShopOnContainers , 最近微软给这个参考应用写了完善 ...

  9. Entity Framework快速入门--ModelFirst

    Entity Framework带给我们的不仅仅是操作上的方便,而且使用上也很是考虑了用户的友好交互,EF4.0与vs2010的完美融合也是我们选择它的一个理由吧.相比Nhibernate微软这方面做 ...

  10. jQuery制作右侧边垂直二级导航菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...