poj1151 Atlanis 线段树+离散化求矩形面积的并
题目链接: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 线段树+离散化求矩形面积的并的更多相关文章
- 【HDU 1542】Atlantis(线段树+离散化,矩形面积并)
求矩形面积并,离散化加线段树. 扫描线法: 用平行x轴的直线扫,每次ans+=(下一个高度-当前高度)*当前覆盖的宽度. #include<algorithm> #include<c ...
- 扫描线 + 线段树 : 求矩形面积的并 ---- hnu : 12884 Area Coverage
Area Coverage Time Limit: 10000ms, Special Time Limit:2500ms, Memory Limit:65536KB Total submit user ...
- 2015 UESTC 数据结构专题E题 秋实大哥与家 线段树扫描线求矩形面积交
E - 秋实大哥与家 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 De ...
- hdu1542 线段树扫描线求矩形面积的并
题意: 给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路: 自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...
- hdu 1542&&poj 1151 Atlantis[线段树+扫描线求矩形面积的并]
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 1542"Atlantis"(线段树+扫描线求矩形面积并)
传送门 •题意 给你 n 矩形,每个矩形给出你 $(x_1,y_1),(x_2,y_2)$ 分别表示这个矩形的左下角和右上角坐标: 让你求这 n 个矩形并的面积: 其中 $x \leq 10^{5} ...
- hdu1828 线段树扫描线求矩形面积的周长
题意: 给你n个矩形,问你这n个矩形所围成的图形的周长是多少. 思路: 线段树的扫描线简单应用,这个题目我用的方法比较笨,就是扫描两次,上下扫描,求出多边形的上下边长和,然后同 ...
- hdu1255 覆盖的面积 线段树+里离散化求矩形面积的交
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 求矩形面积的交的线段树题目,刚做了求并的题目,再做这个刚觉良好啊,只要再加一个表示覆盖次数大于1 ...
- HDU 1828“Picture”(线段树+扫描线求矩形周长并)
传送门 •参考资料 [1]:算法总结:[线段树+扫描线]&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828) •题意 给你 n 个矩形,求矩形并的周长: •题解1(两次扫描线) 周 ...
随机推荐
- 部署在服务器中的WebService
1.继上篇之后,我把我的WebService部署在了比较小的Tomcat中,首先要把Jax-ws.jar架包放在lib里面 2.在我的WEB-INF里面增加了一个xml文件:sun-jaxws.xml ...
- (Facebook开源项目)Fresco:一个新的Android图像处理类库
在Facebook的Android客户端上快速高效的显示图片是非常重要的.然而多年来,我们遇到了很多如何高效存储图片的问题.图片太大,而设备太小.一个像素点就占据了4个字节数据(分别代表R G B和a ...
- 新人报道~cnblogs
我的名字:杨先生 我的英文名:Allen 和你们一样,是一名程序猿,专业技能 C#.前端小块.
- httpclient源码分析之 PoolingHttpClientConnectionManager 获取连接
PoolingHttpClientConnectionManager是一个HttpClientConnection的连接池,可以为多线程提供并发请求服务.主要作用就是分配连接,回收连接等.同一个rou ...
- RecyclerView中装饰者模式应用
近段时间一直在加班,在赶一个项目,现在项目接近尾声,那么需要对过去一段时间工作内容进行复盘,总结下比较好的解决方案,积累一些经验,我认为的学习方式,是「理论-实践-总结-分享」,这一种很好的沉淀方式. ...
- 关于View Link
当需要表格之间的父子结构的时候需要展示时,这个时候就需要建立View Link来实现Table之间的关联.在建立ViewLink时需要现将JDev关闭然后再进行创建自己需要的ViewLink.
- redis实现队列消息的ack
由于公司提供的队列实在太过于蛋疼而且还限制不能使用其他队列,但为了保证数据安全性需要一个可以有ack功能的队列. 原生的redis中通过L/R PUSH/POP方式来实现队列的功能,这个当然是没办法满 ...
- javaScript 基本类型之间转换
在Java中,基本类型之间的强制转换也不是这样的,比如,整数要转换成字符串,必须使用Integer.toString()静态方法或者String.valueOf()静态方法,把字符串转换为整数,必须使 ...
- 一文搞定FastDFS分布式文件系统配置与部署
Ubuntu下FastDFS分布式文件系统配置与部署 白宁超 2017年4月15日09:11:52 摘要: FastDFS是一个开源的轻量级分布式文件系统,功能包括:文件存储.文件同步.文件访问(文件 ...
- hibernate持久化框架
Hibernate是一个优秀的持久化框架 瞬时状态:保存在内存的程序数据,程序退出后,数据就消失了,称为瞬时状态 持久状态:保存在磁盘上的程序数据,程序退出后依然存在,称为程序数据的持久状态 持久化: ...