POJ1151基本的扫描线求面积
题意:
给定n个矩形的对角坐标,分别是左下和右上,浮点型,求矩形覆盖的面积。
思路:
基本的线段树扫描线求面积,没有坑点,不解释了,提示一点,有的题尤其是线段树扫描线的题需要离散化的时候建议二分去找,别map,记得之前map超时过很多次,但不是针对这个题目,这个题数据量不大,怎么都行,发现codeblock这个编译器定义宏然后在定义结构体的时候变量名字相同导致编译不过去,我之前用的DEV也是这么写的,记得能编译过去,不知道为啥。
#include<stdio.h>
#include<string.h>
#include<algorithm>
//#define l ,mid ,t << 1
//#define mid ,r ,t << 1 | 1
#define N 105
using namespace std;
typedef struct
{
double l ,r ,h ,mk;
}EDGE;
double num[105*2*2] ,tmp[105*2*2];
double len[105*2*2*4];
int cnt[105*2*2*4];
EDGE E[105*2];
bool camp(EDGE a ,EDGE b)
{
return a.h < b.h || a.h == b.h && a.mk < b.mk;
}
void PushUp(int l ,int r ,int t)
{
if(cnt[t]) len[t] = num[r] - num[l];
else if(l + 1 == r) len[t] = 0;
else len[t] = len[t<<1] + len[t<<1|1];
}
void Update(int l ,int r ,int t ,int a ,int b ,int c)
{
if(a == l && b == r)
{
cnt[t] += c;
PushUp(l ,r ,t);
return ;
}
int mid = (l + r) >> 1;
if(b <= mid) Update(l,mid ,t << 1 ,a ,b ,c);
else if(a >= mid) Update(mid ,r ,t << 1 | 1 ,a ,b ,c);
else
{
Update(l ,mid ,t << 1 ,a ,mid ,c);
Update(mid ,r ,t << 1 | 1 ,mid ,b ,c);
}
PushUp(l ,r ,t);
}
void BuidTree()
{
memset(cnt ,0 ,sizeof(cnt));
memset(len ,0 ,sizeof(len));
return ;
}
int search2(double now ,int n)
{
int low = 1 ,up = n ,mid ,ans;
while(low <= up)
{
mid = (low + up) >> 1;
if(now <= num[mid])
{
ans = mid;
up = mid - 1;
}
else low = mid + 1;
}
return ans;
}
int main ()
{
int i ,n ,id ,cas = 1;
double x1 ,y1 ,x2 ,y2;
double Ans;
while(~scanf("%d" ,&n) && n)
{
for(id = 0 ,i = 1 ;i <= n ;i ++)
{
scanf("%lf %lf %lf %lf" ,&x1 ,&y1 ,&x2 ,&y2);
E[++id].l = x1;
E[id].r = x2 ,E[id].h = y1 ,E[id].mk = 1;
tmp[id] = x1;
E[++id].l = x1;
E[id].r = x2 ,E[id].h = y2 ,E[id].mk = -1;
tmp[id] = x2;
}
sort(E + 1 ,E + id + 1 ,camp);
sort(tmp + 1 ,tmp + id + 1);
int n2 = n * 2;
for(id = 0 ,i = 1 ;i <= n2 ;i ++)
{
if(i == 1 || tmp[i] != tmp[i-1])
num[++id] = tmp[i];
}
BuidTree();
E[0].h = E[1].h;
Ans = 0;
for(i = 1 ;i <= n2 ;i ++)
{
Ans += len[1] * (E[i].h - E[i-1].h);
int l = search2(E[i].l ,id);
int r = search2(E[i].r ,id);
Update(1 ,id ,1 ,l ,r ,E[i].mk);
}
printf("Test case #%d\n" ,cas ++);
printf("Total explored area: %.2lf\n\n" ,Ans);
}
return 0;
}
POJ1151基本的扫描线求面积的更多相关文章
- 覆盖的面积 HDU - 1255(扫描线求面积交)
题意: 就是扫描线求面积交 解析: 参考求面积并.... 就是把down的判断条件改了一下..由w > 0 改为 w > 1 同时要讨论一下 == 1 时 的情况, 所以就要用到一个临时 ...
- hdu1542 Atlantis 线段树--扫描线求面积并
There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some ...
- HDU 1255 覆盖的面积(线段树:扫描线求面积并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 题目大意:给你若干个矩形,让你求这些矩形重叠两次及以上的部分的面积. 解题思路:模板题,跟HDU ...
- Picture POJ - 1177(扫描线求面积并)
题意:求矩形并的面积.. 解析: 扫描线第一道题....自下而上扫描的... 如果不懂什么是扫描线戳我 #include <iostream> #include <cstdio> ...
- HDU 1542"Atlantis"(线段树+扫描线求矩形面积并)
传送门 •题意 给你 n 矩形,每个矩形给出你 $(x_1,y_1),(x_2,y_2)$ 分别表示这个矩形的左下角和右上角坐标: 让你求这 n 个矩形并的面积: 其中 $x \leq 10^{5} ...
- Atlantis poj1151 线段树扫描线
Atlantis poj1151 线段树扫描线 题意 题目给了n个矩形,每个矩形给了左下角和右上角的坐标,矩形可能会重叠,求的是矩形最后的面积. 题解思路 这个是我线段树扫描线的第一题,听了学长的讲解 ...
- HDU 1828 Picture(线段树扫描线求周长)
Picture Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- HDU 1828“Picture”(线段树+扫描线求矩形周长并)
传送门 •参考资料 [1]:算法总结:[线段树+扫描线]&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828) •题意 给你 n 个矩形,求矩形并的周长: •题解1(两次扫描线) 周 ...
- poj 3348--Cows(凸包求面积)
链接:http://poj.org/problem?id=3348 Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: ...
随机推荐
- 再来认识一下 Java 序列化
前言 在面试中,Java 序列化被问到的几率还是挺高的.所以搜集了 Java 序列化常见的问题,由浅入深的帮助大家进一步学习和理解. 序列化基础知识 什么是序列化? Java 序列化是 JDK 1.1 ...
- 聊一聊和Nacos 2.0.0对接那些事
前言 nacos 2.0.0 已经发布了 alpha1, alpha2 和 beta 三个版本了,部分测试报告也已经出来了. Nacos2.0.0-ALPHA2 服务发现性能测试报告 Nacos 2. ...
- php伪协议分析与CTF例题讲解
本文大量转载于:https://blog.csdn.net/qq_41289254/article/details/81388343 (感谢博主) 一,php:// 访问输入 ...
- java安全初学之动态代理
前言:作为安全人员,代理大家用的都很多,那什么是java中的动态代理呢?事实上,java中的"动态"也就意味着使用了反射,因此动态代理是基于反射机制的一种代理模式. 简介: 代理是 ...
- Centos mini系统下的Hadoop集群搭建
1.事前了解 1.1 Hadoop 百度百科:https://baike.baidu.com/item/Hadoop/3526507?fr=aladdin Hadoop是一个由Apache基金会所开发 ...
- FreeBSD 入门 哲学与玄学
『哲学与玄学』 FreeBSD 是一种 UNIX 哲学(如模块化,一切皆文件等,见< UNIX 编程艺术>❩的发展,也是学院派的代表作品.她是一套工具集,她存在目的是为了让人们更好的生活. ...
- WPF 基础 - DataTemplate 和 ControlTemplate 的关系和应用
1. 关系 凡是 Template,最后都得作用到 控件 上,这个控件就是 Template 的目标控件(也称模板化控件): DataTemplate 一般是落实在一个 ContentPresente ...
- Navicat 121版本激活工具
以下是工具的链接: https://github.com/DoubleLabyrinth/navicat-keygen/blob/windows/README_FOR_WINDOWS.zh-CN.md ...
- C#开发BIMFACE系列38 网页集成开发2:审图系统中的模型或图纸批注
系列目录 [已更新最新开发文章,点击查看详细] 在运维或协同的场景中,经常需要对模型或图纸进行批注,及时记录已发现的问题并交给相关负责的人员. 在开始实现功能之前,先了解一下BIMFACE中有 ...
- 写个锤子JS!它应该是你最后的选择
本文翻译自:https://dev.to/olpeh/javascript-should-be-your-last-resort-5dje 在进行现代化Web前端开发时,使用着自己最爱的框架,有时候可 ...