POJ 1151 Atlantis(线段树-扫描线,矩形面积并)
题目链接:http://poj.org/problem?id=1151
题目大意:坐标轴上给你n个矩形, 问这n个矩形覆盖的面积
题目思路:矩形面积并。
代码如下:
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
const int N = ;
struct Line
{
int l, r, flag;
double h;
Line(){}
Line(int l, int r, int flag, double h):l(l), r(r), flag(flag), h(h) {}
bool operator<(Line &b) const
{
return h<b.h;
}
}; int n;
vector<double> vec;
vector<Line>line; struct node
{
int l, r, flag;
double len;
};
node tree[N << ]; void build(int l, int r, int k)
{
tree[k].l = l, tree[k].r = r, tree[k].len = , tree[k].flag = ;
if(l == r - )
return;
int mid = (l + r) >> ;
build(l, mid, k<<);
build(mid, r, k<<|);
} void updata_up(int k)
{
if(tree[k].flag)
tree[k].len = vec[tree[k].r-] - vec[tree[k].l-];
else if (tree[k].l == tree[k].r - )
tree[k].len = ;
else
tree[k].len = tree[k<<].len + tree[k<<|].len;
} void updata(int l, int r, int k, int x)
{
if(tree[k].l >= l && tree[k].r <= r)
{
tree[k].flag += x;
updata_up(k);
return;
} if(tree[k<<].r > l)
updata(l, r, k<<, x);
if(tree[k<<|].l < r)
updata(l, r, k<<|, x); updata_up(k);
} int main()
{
int cases = ;
while(scanf("%d", &n),n)
{
vec.clear();
line.clear();
double x1[], y1[], x2[], y2[];
for(int i=; i<n; ++ i)
{
scanf("%lf%lf%lf%lf", &x1[i], &y1[i], &x2[i], &y2[i]);
vec.push_back(x1[i]);
vec.push_back(x2[i]);
}
sort(vec.begin(), vec.end());
vec.erase(unique(vec.begin(), vec.end()), vec.end());
for(int i=; i<n; ++ i)
{
int x = lower_bound(vec.begin(), vec.end(), x1[i]) - vec.begin() + ;
int y = lower_bound(vec.begin(), vec.end(), x2[i]) - vec.begin() + ; line.push_back(Line(x, y, , y1[i]));
line.push_back(Line(x, y, -, y2[i]));
}
sort(line.begin(), line.end());
build(, vec.size() + , );
double ans = ;
for(int i=; i<line.size(); ++ i)
{
if(i != )
ans += (line[i].h - line[i-].h)*tree[].len;
updata(line[i].l, line[i].r, , line[i].flag);
}
printf("Test case #%d\nTotal explored area: %.2f\n\n", ++ cases, ans);
}
}
POJ 1151 Atlantis(线段树-扫描线,矩形面积并)的更多相关文章
- POJ 1151 Atlantis 线段树求矩形面积并 方法详解
第一次做线段树扫描法的题,网搜各种讲解,发现大多数都讲得太过简洁,不是太容易理解.所以自己打算写一个详细的.看完必会o(∩_∩)o 顾名思义,扫描法就是用一根想象中的线扫过所有矩形,在写代码的过程中, ...
- hdu 1542&&poj 1151 Atlantis[线段树+扫描线求矩形面积的并]
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- POJ 1151 - Atlantis 线段树+扫描线..
离散化: 将所有的x轴坐标存在一个数组里..排序.当进入一条线段时..通过二分的方式确定其左右点对应的离散值... 扫描线..可以看成一根平行于x轴的直线..至y=0开始往上扫..直到扫出最后一条平行 ...
- poj 3277 City Horizon (线段树 扫描线 矩形面积并)
题目链接 题意: 给一些矩形,给出长和高,其中长是用区间的形式给出的,有些区间有重叠,最后求所有矩形的面积. 分析: 给的区间的范围很大,所以需要离散化,还需要把y坐标去重,不过我试了一下不去重 也不 ...
- hdu1542 Atlantis 线段树--扫描线求面积并
There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some ...
- HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)
版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...
- POJ 1151 / HDU 1542 Atlantis 线段树求矩形面积并
题意:给出矩形两对角点坐标,求矩形面积并. 解法:线段树+离散化. 每加入一个矩形,将两个y值加入yy数组以待离散化,将左边界cover值置为1,右边界置为2,离散后建立的线段树其实是以y值建的树,线 ...
- POJ 1151 Atlantis 线段树+离散化+扫描线
这次是求矩形面积并 /* Problem: 1151 User: 96655 Memory: 716K Time: 0MS Language: G++ Result: Accepted */ #inc ...
- HDU - 1255 覆盖的面积(线段树求矩形面积交 扫描线+离散化)
链接:线段树求矩形面积并 扫描线+离散化 1.给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 2.看完线段树求矩形面积并 的方法后,再看这题,求的是矩形面积交,类同. 求面积时,用被覆 ...
- hdu 1828 Picture(线段树扫描线矩形周长并)
线段树扫描线矩形周长并 #include <iostream> #include <cstdio> #include <algorithm> #include &l ...
随机推荐
- 您只能在 HTML 输出流中使用 document.write。如果您在文档已加载后使用它(比如在函数中),会覆盖整个文档。
刚刚接触JS,看到这句话时一时没搞懂,想了终于有了一些眉目,意思就是在文档加载过后,如果我们用比方说按钮的方式重新加载文档,就会把文档都覆盖: 列如: <!DOCTYPE html> &l ...
- Nginx 502错误触发条件与解决办法汇总(转载)
一些运行在Nginx上的网站有时候会出现“502 Bad Gateway”错误,有些时候甚至频繁的出现.有些站长是在刚刚转移到Nginx之后就出现了这个问题,所以经常会怀疑这是不是Nginx的问题,但 ...
- oracle查询中文数据出现乱码
首先,在oracle中,输入select userenv('language') from dual,查询出oracle使用的编码方式,我的是SIMPLIFIED CHINESE_CHINA.ZHS1 ...
- IntelliJ IDEA 自动化工具安装并添加自动化测试框架
IntelliJ IDEA是一个用于开发人员开发和测试人员自动化测试的测试工具,类似于eclipse. 优点:插件多自身可以携带,自身携带cucumber自动化测试框架,类似于junit一样 缺点:r ...
- CSS鼠标悬停图片加边框效果,不位移的方法
<!DOCTYPE HTML> <html lang="en-US"> <head> <title>css实现鼠标悬停时图片加边框效 ...
- js 表格实现
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- subline text3 删除行 快捷键设置
打开 首选项-->按键绑定 { "keys": ["ctrl+shift+k"], "command": "run_macr ...
- 几种方法实现ajax请求内容时使用浏览器后退和前进功能
ajax是一个非常好玩的小东西,不过用起来也会存在一些问题. 我们可以利用ajax进行无刷新改变文档内容,但是没办法去修改URL,即无法实现浏览器的前进与后退.书签的收藏功能. 利用location的 ...
- 怎么评价Facebook的Relay框架?Meteor.js 是什么?
http://www.zhihu.com/question/34531232?rf=34500201 Meteor.js 是什么? 作者:陈天链接:http://www.zhihu.com/quest ...
- php查看网页源代码的方法
这篇文章主要介绍了php查看网页源代码的方法,涉及php读取网页文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了php查看网页源代码的方法.分享给大家供大家参考.具体实现 ...