题目原链接:http://poj.org/problem?id=1151

题目中文翻译:

POJ 1151 Atlantis

Time Limit: 1000MS

 

Memory Limit: 10000K

Total Submissions: 25769

 

Accepted: 9477

Description

有几个古希腊文本包含传说中的亚特兰蒂斯岛的描述。 其中一些文本甚至包括岛屿部分地图。 但不幸的是,这些地图描述了亚特兰蒂斯的不同区域。 您的朋友Bill必须知道地图的总面积。 你(不明智地)自告奋勇写了一个计算这个数量的程序。

Input

输入包含几个测试用例。 每个测试用例都以一行包含一个整数n(1 <= n <= 100)开始,指示可用的地图。以下n行描述了每个地图。 这些行中的每一行包含四个数字x1; y1; x2; y2(0 <= x1 <x2 <= 100000; 0 <= y1 <y2 <= 100000),不一定是整数。 值(x1; y1)和(x2; y2)是地图左上角和右下角的坐标。

输入文件以包含单个0的行作为终止。不处理它。

Output

对于每个测试用例,您的程序应输出一个部分。 每个部分的第一行必须是“Test case #k”,其中k是测试用例的编号(从1开始)。 第二个必须是“Total explored area:a”,其中a是总探索区域(即此测试用例中所有矩形的覆盖区域),精确到小数点后两位数。

在每个测试用例后输出一个空行。

Sample Input

2

10 10 20 20

15 15 25 25.5

0

Sample Output

Test case #1

Total explored area: 180.00

解题思路:

本人太菜,无法描述,请看大佬详解:AKIOI

AC代码:

(由此大佬博客借鉴而来:code)

 #include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; struct kkk{//线段树
int l,r;//线段树的左右整点
int c;//c用来记录重叠情况
double cnt,lf,rf;//cnt用来计算实在的长度,lf,rf分别是对应的左右真实的浮点数端点
}s[]; struct k2{
double x,y1,y2;
int f;
}l[];
//把一段段平行于y轴的线段表示成数组 ,
//x是线段的x坐标,y1,y2线段对应的下端点和上端点的坐标
//一个矩形 ,左边的那条边f为1,右边的为-1,
//用来记录重叠情况,可以根据这个来计算,kkk节点中的c double y[];//记录y坐标的数组 bool cmp(k2 a,k2 b) {
return a.x < b.x;
} void build(int t,int l,int r) {
s[t].l = l;s[t].r = r;
s[t].cnt = s[t].c = ;
s[t].lf = y[l];
s[t].rf = y[r];
if(l + == r) return ;
int mid = (l + r) >> ;
build(t << ,l,mid);
build(t << | ,mid,r);
} void calen(int t) {//计算长度
if(s[t].c > ) {// t对应对节点有线段覆盖
s[t].cnt = s[t].rf - s[t].lf;
return ;
}
// 现在是t对应的线段没有完整的被覆盖,但是他的孩子节点可能部分被覆盖
if(s[t].l + == s[t].r) s[t].cnt = ;//线段树叶子结点,代表一个点,特判,长度为0
else s[t].cnt = s[t<<].cnt + s[t<<|].cnt;//否则,用孩子的和来表示
} void update(int t,k2 e) {//加入线段e,后更新线段树
if(e.y1 == s[t].lf && e.y2 == s[t].rf) {//如果正好找到区间
s[t].c += e.f;
calen(t);
return ;
}
if(e.y2 <= s[t<<].rf) update(t<<,e);//下传左儿子
else if(e.y1 >= s[t<<|].lf) update(t<<|,e);//下传右儿子
else {//左右儿子都下传
k2 tmp = e;
tmp.y2 = s[t<<].rf;
update(t<<,tmp);
tmp = e;
tmp.y1 = s[t<<|].lf;
update(t<<|,tmp);
}
calen(t);
} int main() {
int i,n,t,aa = ;
double x1,y1,x2,y2;
while(scanf("%d",&n),n) {
aa++;
t = ;
for(int i = ;i <= n; i++) {
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
l[t].x = x1;
l[t].y1 = y1;
l[t].y2 = y2;
l[t].f = ;
y[t++] = y1;
l[t].x = x2;
l[t].y1 = y1;
l[t].y2 = y2;
l[t].f = -;
y[t++] = y2;
}
sort(l+,l+t,cmp);
sort(y+,y+t);
build(,,t-);//建树
update(,l[]);//下传lazy标记
double res = ;
for(int i = ;i < t; i++) {
res += s[].cnt * (l[i].x - l[i-].x);
update(,l[i]);
}
printf("Test case #%d\nTotal explored area: %.2f\n\n",aa,res);
}
}

POJ 1151 Atlantis(扫描线)的更多相关文章

  1. POJ 1151 Atlantis (扫描线+线段树)

    题目链接:http://poj.org/problem?id=1151 题意是平面上给你n个矩形,让你求矩形的面积并. 首先学一下什么是扫描线:http://www.cnblogs.com/scau2 ...

  2. POJ 1151 Atlantis 矩形面积求交/线段树扫描线

    Atlantis 题目连接 http://poj.org/problem?id=1151 Description here are several ancient Greek texts that c ...

  3. POJ 1151 Atlantis(线段树-扫描线,矩形面积并)

    题目链接:http://poj.org/problem?id=1151 题目大意:坐标轴上给你n个矩形, 问这n个矩形覆盖的面积 题目思路:矩形面积并. 代码如下: #include<stdio ...

  4. hdu 1542&&poj 1151 Atlantis[线段树+扫描线求矩形面积的并]

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  5. POJ 1151 Atlantis 线段树+离散化+扫描线

    这次是求矩形面积并 /* Problem: 1151 User: 96655 Memory: 716K Time: 0MS Language: G++ Result: Accepted */ #inc ...

  6. POJ 1151 - Atlantis 线段树+扫描线..

    离散化: 将所有的x轴坐标存在一个数组里..排序.当进入一条线段时..通过二分的方式确定其左右点对应的离散值... 扫描线..可以看成一根平行于x轴的直线..至y=0开始往上扫..直到扫出最后一条平行 ...

  7. POJ 1151 Atlantis 求矩阵面积并 扫描线 具体解释

    题意: 给定n个矩阵的左下角和右上角坐标,求矩阵面积并(矩阵总是正放的,即与x轴y轴都平行) 思路: 扫描线裸题 http://www.cnblogs.com/fenshen371/p/3214092 ...

  8. POJ 1151 Atlantis(经典的线段树扫描线,求矩阵面积并)

    求矩阵的面积并 采用的是区间更新 #include <iostream> #include <stdio.h> #include <string.h> #inclu ...

  9. poj 1151 Atlantis (离散化 + 扫描线 + 线段树 矩形面积并)

    题目链接题意:给定n个矩形,求面积并,分别给矩形左上角的坐标和右上角的坐标. 分析: 映射到y轴,并且记录下每个的y坐标,并对y坐标进行离散. 然后按照x从左向右扫描. #include <io ...

随机推荐

  1. 关于Android滑动冲突的解决方法(二)

    之前的一遍学习笔记主要就Android滑动冲突中,在不同方向的滑动所造成冲突进行了了解,这样的冲突非常easy理解,当然也非常easy解决.今天,就同方向的滑动所造成的冲突进行一下了解,这里就先以垂直 ...

  2. 在git push前怎样遗弃掉历史commit

    今天写了一天代码,然后 git hub commit 了 多达 7 次. 可是都没有把改动正式推送上去. 结果最后要推送的时候发现中间有一个提交文件超过了100M. 是 vs 的代码性能分析报告 .v ...

  3. 【BZOJ】1007 水平可见直线

    [分析] 维护一个下凸包. 首先依照斜率来从小到大排序. 考虑斜率同样的,肯定仅仅能选截距大的,把截距小的给筛掉. 然后用栈来维护下凸包.先压入前两条直线. 然后对于每一条直线i,设栈中上一条直线p= ...

  4. XML复习笔记(复习资料为菜鸟教程里的XML教程)

    XML 指可扩展标记语言(eXtensible Markup Language) XML 的设计宗旨是传输数据,而不是显示数据. XML 标签没有被预定义.您需要自行定义标签. XML 被设计为具有自 ...

  5. Client should know only resource URIs and that’s all.

    REST Principles and Architectural Constraints – REST API Tutorial https://restfulapi.net/rest-archit ...

  6. adb常用命令整理

    adb connect <IPAddress:Port>  //通过指定的IP地址及端口连接设备 adb devices  //显示所有已连接的设备 adb install <Pac ...

  7. hdoj 1875 畅通project再续【最小生成树 kruskal &amp;&amp; prim】

    畅通project再续 Problem Description 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其它的小岛时都要通过划小船来实现. ...

  8. VS1053 datasheet 解读笔记

    pdf  10 pdf 11 ` 左右声道 负载,注意这里的负载指LEFT 到GBUF,RIGHT到GBUF.所以后面会有说明GBUF一定不能连接到GND. pdf 14 pdf 14 从上面的引脚定 ...

  9. HDU4513 吉哥系列故事——完美队形II Manacher算法

    题目链接:https://vjudge.net/problem/HDU-4513 吉哥系列故事——完美队形II Time Limit: 3000/1000 MS (Java/Others)    Me ...

  10. 使用cocoaPods加载框架的具体步骤:

    注意事项: 1.使用之前备份一下代码.因为pod更新很快,如果某个文件名有中文,pod install 一下.整个项目可能就要废掉了. 2.如果不把pod文件推动到远程服务器. 每一次用的时候在本地p ...