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: ...
随机推荐
- WIFI6 基本知识(二)
WI-FI6核心技术 WI-FI6除了继承了WI-FI5的所有MIMO特性之外,还增加了许多针对高密部署场景的特性.以下是WI-FI6的核心新特性: OFDMA频分复用技术 DL/UL MU-MIMO ...
- Java 面向对象 01
面向对象·一级 面向对象思想概述 * A:面向过程思想概述 * 第一步 * 第二步 * B:面向对象思想概述 * 找对象(第一步,第二步) * C:举例 * 买煎饼果子 ...
- SQL驱动限制,导致插入失败
insert into TB_IF_ORDERS (DC_CD,JOB_DT,SEQ_NO,ORDER_KEY,ORDER_ID,ORDER_LINE_NUM,COMPANY_CD,CUST_CD,S ...
- 开源项目renren-fast开发环境部署(后端部分)
开源项目renren-fast开发环境部署(后端部分) 说明:renren-fast是一个开源的基于springboot的前后端分离手脚架,当前版本是3.0 开发文档需要付费,官方的开发环境部署介绍相 ...
- python torndb模块
一.torndb概述 torndb是一个轻量级的基于MySQLdb封装的一个模块,其是tornado框架的一部分.其项目主页为:https://github.com/bdarnell/torndb . ...
- 【Azure 应用程序见解】 Application Insights 对App Service的支持问题
问题描述 Web App 发布后, Application Insights 收集不到数据了 问题分析 在应用服务(App Service)中收集应用的监控数据(如Request,Exception, ...
- Linux内核源码分析之setup_arch (四)
前言 Linux内核源码分析之setup_arch (三) 基本上把setup_arch主要的函数都分析了,由于距离上一篇时间比较久了,所以这里重新贴一下大致的流程图,本文主要分析的是bootmem_ ...
- QT项目-Chart Themes Example学习(一)
1.main.cpp #include "themewidget.h" #include <QtWidgets/QApplication> #include <Q ...
- OO第一单元感悟与体会
第一单元的三次编程作业结束了,现在分享一些我对自己作业的分析和感想 1.程序结构的分析 第一次作业: 本次作业我的主要思路是,为每一项写一个正则表达式,在输入的字符串中匹配每一项,多项式类中保存着一个 ...
- Mybatis的多表操作
1.Mybatis多表查询 1.1 一对一查询 1.1.1 一对一查询的模型MapperScannerConfigurer 用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户 一对一 ...