Atlantis (POJ - 1151,扫描线模板)

Sketchup6 to Atlantis2_Win插件 su导出art格式插件,使用artlantis必备 立即下载

一.题目链接:

POJ-1151

二.题目大意:

求 n 个矩形的面积并.

三.分析:

模板题.

搬运大佬的链接

四.代码实现:

① O(N^2)

#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <bitset>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-6
#define lc k * 2
#define rc k * 2 + 1
#define pi acos(-1.0)
#define ll long long
#define ull unsigned long long
using namespace std;

const int M = (int)1e2;
const int mod = 998244353;
const ll inf = 0x3f3f3f3f3f3f3f3f;

int n, ylen;
double y[M * 2 + 5];
int cnt[M * 2 + 5];
map <double, int> row;

struct node
{
    double x, y1, y2;
    int k;
}line[M * 2 + 5];

bool cmp(node a, node b)
{
    return a.x < b.x;
}

double ScanLine()
{
    sort(y + 1, y + ylen + 1);
    ylen = unique(y + 1, y + ylen + 1) - (y + 1);
    for(int i = 1; i <= ylen; ++i)
        row[y[i]] = i;
    memset(cnt, 0, sizeof(cnt));
    sort(line + 1, line + 2 * n + 1, cmp);
    double ans = 0.0;
    for(int i = 1; i <= 2 * n; ++i)
    {
        double y1 = line[i].y1, y2 = line[i].y2;
        for(int j = row[y1]; j < row[y2]; ++j)
            cnt[j] += line[i].k;
        double height = 0.0;
        for(int j = 1; j < ylen; ++j)
        {
            if(cnt[j])
                height += y[j + 1] - y[j];
        }
        ans += height * (line[i + 1].x - line[i].x);
    }
    return ans;
}

int main()
{
    int ca = 0;
    while(~scanf("%d", &n) && n)
    {
        ylen = 0;
        for(int i = 1; i <= n; ++i)
        {
            scanf("%lf %lf %lf %lf", &line[i * 2 - 1].x, &line[i * 2 - 1].y1, &line[i * 2].x, &line[i * 2].y2);
            line[i * 2 - 1].y2 = line[i * 2].y2, line[i * 2 - 1].k = 1;
            line[i * 2].y1 = line[i * 2 - 1].y1, line[i * 2].k = -1;
            y[++ylen] = line[i * 2 - 1].y1, y[++ylen] = line[i * 2 - 1].y2;
        }
        double ans = ScanLine();
        printf("Test case #%d\n", ++ca);
        printf("Total explored area: %.2f\n\n", ans);
    }
    return 0;
}

② O(N logN)

#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <bitset>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-6
#define lc k * 2
#define rc k * 2 + 1
#define pi acos(-1.0)
#define ll long long
#define ull unsigned long long
using namespace std;

const int M = (int)1e2;
const int mod = 998244353;
const ll inf = 0x3f3f3f3f3f3f3f3f;

int n, ylen;
double y[M * 2 + 5];
map <double, int> row;
int cnt[M * 2 + 5];
struct node
{
    double x, y1, y2;
    int k;
}line[M * 2 + 5];

bool cmp(node a, node b)
{
    return a.x < b.x;
}

double ScanLine()
{
    sort(y + 1, y + ylen + 1);
    ylen = unique(y + 1, y + ylen + 1) - (y + 1);
    memset(cnt, 0, sizeof(cnt));
    for(int i = 1; i <= ylen; ++i)
        row[y[i]] = i;
    sort(line + 1, line + 2 * n + 1, cmp);
    double ans = 0.0;
    for(int i = 1; i <= 2 * n; ++i)
    {
        double y1 = line[i].y1, y2 = line[i].y2;
        for(int j = row[y1]; j < row[y2]; ++j)
            cnt[j] += line[i].k;
        double height = 0.0;
        for(int j = 1; j < ylen; ++j)
        {
            if(cnt[j])
                height += y[j + 1] - y[j];
        }
        ans += height * (line[i + 1].x - line[i].x);
    }
    return ans;
}

int main()
{
    int ca = 0;
    while(~scanf("%d", &n) && n)
    {
        ylen = 0;
        for(int i = 1; i <= n; ++i)
        {
            scanf("%lf %lf %lf %lf", &line[i * 2 - 1].x, &line[i * 2 - 1].y1, &line[i * 2].x, &line[i * 2].y2);
            line[i * 2 - 1].y2 = line[i * 2].y2, line[i * 2 - 1].k = 1;
            line[i * 2].y1 = line[i * 2 - 1].y1, line[i * 2].k = -1;
            y[++ylen] = line[i * 2].y1, y[++ylen] = line[i * 2].y2;
        }
        printf("Test case #%d\n", ++ca);
        printf("Total explored area: %.2f\n\n", ScanLine());
    }
    return 0;
}

 

STM32+OpenCV云台PID调参实战:从震荡到丝滑跟踪的进阶之路 本文详细介绍了基于STM32和OpenCV的跟踪云台PID调参实战经验。从硬件搭建、PID控制原理到调参技巧,系统讲解了如何通过调整比例、积分和微分参数解决系统震荡问题,实现从震荡到丝滑跟踪的进阶过程,特别适合电赛和嵌入式视觉控制开发者参考。 阅读详情

相关推荐

碎碎念android eMMC【转】

本文转载自:https://blog.youkuaiyun.com/Fybon/article/details/44242549 一、/dev/blockroot@:/dev/block #lsbootdevicemmcblk0mmcblk0p1mmcblk0p10…….mmcblk0p18mmcblk0p19mmcblk0p2mmcblk0p20……mmcblk0p29mmcblk0p3mmcblk0p3...

zzb2760715357的博客 377

poj - 1151 - Atlantis(离线化+扫描线+线段树)

题意:求n个矩形面积的并(1 题目链接:http://poj.org/problem?id=1151 ——>>思路是这样的,提取出所有矩形的所有纵向边作为扫描线,从左往右扫描,每处理一条扫描线时,下一条扫描线与当前扫描线的距离乘上当前覆盖到纵向边长度是一个部分面积,将这些面积累加起来就是n个矩形面积的并。。 而当前覆盖到纵向边长度可通过线段树来维护。。空间上则要求先对所有点的纵坐标进行离散

无节操 2887

【CAN通讯系列18】- NM在干什么?休眠唤醒

同时针对不同休眠或唤醒场景,网管报文的userdata有所区别,如何做到场景与网管报文内容一一映射,通常会定义另一帧报文,用来表明当前是哪个或哪几个唤醒条件或休眠条件满足。又或者如果用户发现汽车电量不充足了,那么会有充电需求,插枪充电,这时如果插上慢充枪,那么OBC会先被唤醒,识别出插枪行为及其慢充枪的连接状态,然后OBC唤醒BMS和其他相关的控制器进行充电。也就是说,通过对一个又一个整车功能和应用场景的详细分析,最终能够汇总出整车所有的休眠唤醒场景需求,通常会用一个表格来管理,俗称休眠唤醒表。

menghuyouyou的博客 1167

POJ1151 Atlantis(扫描线、线段树)

Atlantis Description There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the island. But unfortunately, these maps describe different regions of Atlantis. Your fri

m0_51864047的博客 297

dell r630 配置raid_DELL服务器RAID配置图文教程

名称解释:Disk Group:磁盘组,这里相当于是阵列,例如配置了一个RAID5,就是一个磁盘组VD(Virtual Disk): 虚拟磁盘,虚拟磁盘可以不使用阵列的全部容量,也就是说一个磁盘组可以分为多个VDPD(Physical Disk): 物理磁盘HS:Hot Spare 热备Mgmt:管理【一】创建逻辑磁盘1、按照屏幕下方的虚拟磁盘管理器提示,在VD Mgmt菜单(可以通过CTRL+P...

weixin_33253741的博客 3510

主流 AI 插件 之一的 Copilot 介绍

Copilot 是微软推出的一款人工智能助手,旨在通过自然语言交互帮助您提升工作效率和创造力,覆盖多平台,提供智能问答、内容生成、代码辅助等功能。其核心定位为“日常 AI 伴侣”,旨在通过自然语言交互提升工作与生活效率。

u014695938的博客 6877

Atlantis项目常见问题解决方案

Atlantis项目常见问题解决方案 项目基础介绍 Atlantis是一个强大的Swift日志框架,旨在通过最大程度的可读性来加速开发。它是一个输入无关的框架,意味着你可以传递任何类型的数据,包括字符串、自定义对象等,并且它会自动美化打印所有值。Atlantis特别适用于企业开发、初创公司或快速原型API的开发。 主要编程语言 该项目主要使用Swift编程语言。 新手使用注意事项及解决方案 1. ...

gitblog_00672的博客 537

【超详细】MIT 液态神经网络(LNNs)——深度学习新动向

输入可以是任何形式的时间序列数据,其中表示时间。例如传感器读数、金融市场数据、语音信号等。

allein_STR的博客 2611

POJ 1151 Atlantis(扫描线法、线段树、离散化)

POJ 1151 Atlantis(扫描线法、线段树、离散化) 蓝书线段树练习题 POJ 1151 Atlantis 题意:给定n个矩形的左下、右上的两个坐标点(x,y)(x,y)(x,y),求他们的面积并(总面积) 数据范围:n:100、x/y:1e5n:100、x/y:1e5n:100、x/y:1e5 思路:现在好困明天再写^^ LL n; struct SegmentTree{ int ...

手扶拖拉机如何改装四驱 181

[VCS]VCS checkpoint简介以及其在SoC验证加速中的作用

VCS checkpoint是Synopsys VCS提供的快照/恢复机制,可显著加速SoC验证。其核心是在仿真关键节点(如完成初始化后)保存系统状态,后续测试可直接从该点恢复,避免重复执行冗长的初始化阶段(如boot、DDR训练等)。该技术特别适用于多测试用例共享同一初始状态的场景,通过分离初始化与功能验证流程,可提升回归效率3-5倍。需注意处理DPI-C状态同步、版本管理及存储优化等问题,结合UVM和自动化脚本可实现更高效的验证流程。典型应用可节省数百万cycle的重复仿真时间。

元直的博客 774

第二天 原来Labview语言结构也挺自然(2.1 顺序结构)

新建项目文件StructureTest.lvproj,新建四个子VI(FlatSequence.vi、CaseStructure.vi、LoopStructure.vi、EventStructure.vi),具体新建流程可以参考1.2节。

weixin_38637405的博客 1003

【亲测免费】 推荐开源项目:Atlantis-Lite - 轻量级Bootstrap 4管理后台模板

推荐开源项目:Atlantis-Lite - 轻量级Bootstrap 4管理后台模板 1. 项目介绍 Atlantis-Lite 是一款基于Bootstrap 4框架的免费管理后台模板,旨在优雅地展示各类指标、数字和数据可视化效果。这个精心设计的仪表板不仅外观出色,而且功能强大,能够帮助开发者快速创建出美观且实用的数据展示平台。 2. 项目技术分析 该项目采用了流行的前端开发库Bootstra...

gitblog_00078的博客 683

MIKE水动力笔记1_岸线及水深数据之依靠全球数据库资源提取的方法

通过各种数据库资源来获取全球岸线及水深数据,这种方法获取的岸线及水深数据精度偏低,比较适合大尺度范围的水动力研究。

晏长街的博客 1万+

Atlantis 【POJ - 1151】【扫描线模板讲解】

题目链接   是第二次写这道题了,但是也加深了我对扫描线的印象了,具体什么是扫描线,我们就如是讲讲吧:   扫描线就是为了方便处理有重的区间面积的方式,我们通过线段树的方式去优化它,可以做到更少的时间复杂度,对于一个二维平面,我们用一个平行于Y轴的线向上递推,每次可以取到一次距离,并且Y不重叠。那么扫描线之间的Y轴差就是高度,我们在乘以它所得到的宽度X轴的覆盖,那么不断这样累加,就能得到完全的...

既然弱小,就只顾变强就是了 563

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Atlantis 【POJ - 1151】【扫描线模板题+线段树更新】

题目链接   是一道扫描线的模板题,也是我的第一道扫描线的题了,对扫描线也算是有了第一次的理解,无非就是更新新的向上的区间长度,然后去查询就是了,而查询是O(1)的,因为可以通过树的最上根节点得到的。 #include &lt;iostream&gt; #include &lt;cstdio&gt; #include &lt;cmath&gt; #include &lt;string&gt;...

既然弱小,就只顾变强就是了 471

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Atlantis--POJ1151---线段树扫描线图文详解+模板

Describtion: There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the island. But unfortunately, these maps ...

Bearing in mind forever! 672

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【luogu5490】【POJ1151】【模板】扫描线 /Atlantis (求矩形面积并)

Problem solution 扫描线:假设有一条扫描线从一个图形的下方扫向上方(或者左方扫到右方),那么通过分析扫描线被图形截得的线段就能获得所要的结果。该过程可以用线段树(维护区间信息)进行加速。 求矩形面积并:矩形的面积简化为 ∑ 截线段长度×扫过的高度。 对于扫过的高度只需要将直线存起来按照高度h从下到上排序,每次的 (line[i+1].h-line[i].h) 就是扫过的高度。 对于当前的截线段长度, 为了快速计算出截线段长度, 我们可以将矩形的横边附上不同的长度(下边权1,上边

小哈里的博客 839

POJ 1151 & HDU 1542 Atlantis(扫描线模板 线段树 离散化)

POJ 1151 & HDU 1542 Atlantis(扫描线模板 线段树 离散化)

1175

POJ1151 (HDU 1542) Atlantis【矩形面积并,线段树+离散化+扫描线模板】

Description There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the island. But unfortunately, these map

MissZhou要努力 1656

POJ 1151 Atlantis(扫描线求面积)

POJ 1151 Atlantis(扫描线求面积)

Insist111 347

POJ 1151 Atlantis【扫描线】

题目链接 题目描述: 扫描线模板题:给一些矩形的左下和右上坐标,求这些矩形面积的并集。 题解: 扫描线朴素算法O(n^2): 设想有这样一条竖直(或水平)无限长的线,从左往右扫,扫的时候逐渐累加面积。 我们将每个矩形用一个四元组<x, y1, y2, k>表示,即表示矩形的两条对边,设矩形的左边那条边k = 1,右边那条边k = -1。设某一时刻扫描线与矩形并集最外面的两个交点之间的距离为len,则存在一个区间[x1, x2]上两个交点的距离一直是len,扫描线从x1->x2这段累加的

weixin_44258590的博客 273

[poj1151]Atlantis & [poj1177]picture(扫描线)

玩一玩扫描线,这个东西还是很强力的,而且容易yy。但是就是细节很多,所以查错特别麻烦。 推荐这篇blog: https://www.cnblogs.com/yangsongyi/p/8378629.html 【poj1151】 http://poj.org/problem?id=1151 题意: 在平面直角坐标系上有一些矩形,他们可能会互相重叠,求矩阵的并(也就是所有矩阵覆盖的部分)的面积。譬如...

私は Mocha!! 537

POJ 1151 Atlantis

首先,我得吐个槽。陶叔果然

陀罗地 543

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

这是一道模板题,描述了一种叫扫描线的算法 题意就是给出一个坐标系和 nnn 个矩形,求面积并,如下图(比较模糊,见谅):

Hacheylight 433

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

Atlantis 题目连接 http://poj.org/problem?id=1151 Description here are several ancient Greek texts that contain descriptions of the fabled island Atlanti...

weixin_30415801的博客 153

专题·扫描线【including 例题Atlantis

初见安~扫描线是一个基于线段树的算法,建议先了解下~ 首先以题目为背景。 Atlantis(亚特兰蒂斯) 本题来自POJ1151,题目来自ACWing。 有几个古希腊书籍中包含了对传说中的亚特兰蒂斯岛的描述。 其中一些甚至包括岛屿部分地图。 但不幸的是,这些地图描述了亚特兰蒂斯的不同区域。 您的朋友Bill必须知道地图的总面积。 你自告奋勇写了一个计算这个总面积的程序。 输...

樱狸✨愿携清风归来处 757
上一篇: Interval GCD(算法竞赛进阶指南,拓展更相减损之术 + 差分数组 + 线段树)
下一篇: Distance in Tree (CodeForces - 161D,点分治)
The___Flash
博客等级 码龄8年 79粉丝 223原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值