POJ 1151 Atlantis(扫描线)

时间:2023-02-09 00:31:41

题目原链接: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 &lpar;扫描线&plus;线段树&rpar;

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

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

    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&amp&semi;&amp&semi;poj 1151 Atlantis&lbrack;线段树&plus;扫描线求矩形面积的并&rsqb;

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

  5. POJ 1151 Atlantis 线段树&plus;离散化&plus;扫描线

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

  6. POJ 1151 - Atlantis 线段树&plus;扫描线&period;&period;

    离散化: 将所有的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 (离散化 &plus; 扫描线 &plus; 线段树 矩形面积并)

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

随机推荐

  1. mac 安装mvn 失败

    安装过程遇到2个问题 1.java版本不对 2.Error: JAVA_HOME is not defined correctly. We cannot execute $/usr/libexec/j ...

  2. C&num;窗体钉在桌面、置底、嵌入桌面的办法

    想做一个桌面时钟,钉在桌面上不影响正常使用,只在看桌面的时候显示. 从网上多方寻找找到这么个代码,但是还是有不方便的地方,大家探讨一下. 这个程序在使用“显示桌面”的时候还可以显示,将程序的Form1 ...

  3. a中国天气网pi(json格式)

    http://m.weather.com.cn/data/101050101.html 此接口的回报格式例如以下 { "weatherinfo": { "city&quo ...

  4. JVM调优总结(十)-调优方法

    JVM调优工具 Jconsole,jProfile,VisualVM Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用.对垃圾回收算法有很详细的跟踪.详细说明参考这里 ...

  5. swift中标签的使用

    1,标签的创建 1 2 3 4 5 6 7 8 9 10 import UIKit class ViewController: UIViewController {     override func ...

  6. Cain工具ARP欺骗攻击

    OS:Win7工具:Cainhttp://pan.baidu.com/s/1xq9lW 密码:409z 网络:本机和被攻击电脑有线连接路由器. Cain是有名的局域网嗅探工具,有丰富的功能.比如可以解 ...

  7. python 输入一个字符串,打印出它所有的组合

    import itertools str = input('请输入一个字符串:') lst = [] for i in range(1, len(str)+1): lst1 = [''.join(x) ...

  8. spring boot中注入jpa时报could not autowire&period;No beans of &&num;39&semi;PersonRepository&&num;39&semi; type found

    解决方法,在repository加一个注解.如下图所示: @Component

  9. Nginx 代理

    如下,配置 Nginx 成为一台代理服务器 [root@localhost ~]$ cat /usr/local/nginx/conf/vhost/proxy.conf server { listen ...

  10. ProtocolBuffers &lpar;二&rpar; android与PC,C&num;与Java 利用protobuf 进行无障碍通讯【Socket】

    protobuf 是什么?   Protocol buffers是一种编码方法构造的一种有效而可扩展的格式的数据. 谷歌使用其内部几乎RPC协议和文件格式的所有协议缓冲区. 参考文档 http://c ...