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: ...
随机推荐
- webstorm2020.3安装破解教程
免责声明:本教程及相关附件仅限于学术交流,不能用于商业以及违法用途,请于下载后24小时内删除!如产生法律纠纷,一切与本人无关,呼吁各位小伙伴支持下正版软件.本文如有侵权,请联系小编删除之. 该操作是用 ...
- 1.2 Python3基础-规范
>>返回主目录 总的来说,如果安装的不是安装的Anaconda,pip命令还是经常会用到的(cmd模式使用),当然也可以在PyCharm中直接安装 PEP8规范,我另有一篇博客已经写好,可 ...
- GNS3通过“云”连接到虚拟机实验
GNS3通过"云"连接到虚拟机实验并使用wireshark工具对数据分析 观看本文之前注意!!!!! 做这次实验,我所遇到的问题,会全部写在文章结尾,如果读者们遇到问题,可查看. ...
- drf给上传图片重命名
1.先在你项目中添加一个文件夹如:system 在文件夹下添加__init__.py 和storage.py文件,并在storage.py中添加如下代码: #复制代码 -- coding: UTF-8 ...
- 常见 git 需求整理(持续更新中)
首发于 语雀文档 突然感觉自己对 git 还是挺熟悉的,因为团队里新来的七八号应届生来问我 git 问题,基本没有答不上的情况,但为了能更好地对知识进行整理,还是记录一下为好. (希望能)持续更新.. ...
- 16. 使用vue3结构及配置管理
主要内容: vue-cli2和3的区别 创建vue-cli3脚手架 vue-cli3项目的目录结构 vue-cli2和vue-cli3中 main.js文件的区别 vue-cli3的配置文件管理 一. ...
- FreeBSD csh shell 配置
在/etc/csh.cshrc里面加入: alias ls ls –G, 并重新登录 问:如何让FreeBSD的csh像bash那样按tab列出列出无法补齐的候选文件? 答:标准的方法是按Ctrl+D ...
- Serverless Wordpress 系列建站教程(三)
从前面两篇教程文章里,我们可以了解到 Serverless WordPress 的低门槛部署,免运维等功能优势.而建站场景中,开发者关注的另一个重点则是成本问题,Serverless 架构究竟如何计费 ...
- C语言入门-mingw64安装+配置
OK,大家好,结合上期所说,本期让我们来配置编译器吧! 首先先下载mingw64离线包,官网下载慢,可以去群里下载,*.7z格式(有些同学可能没有解压软件,为了照顾这部分同学,笔者提供*.exe格式的 ...
- Qt update刷新之源码分析总结
大家好,我是IT文艺男,来自一线大厂的一线程序员 经过前面几次的Qt源码讲解,我相信大家对Qt update刷新机制从底层原理上有了一个深刻的理解:这次做一个收尾总结,来复盘前面几次所讲解的内容: 分 ...