HDU 1542 —— Atlantis 【矩形面积并:扫描线】

Atlantis解题报告 Atlantis 线段树 离散化 解题报告 立即下载

HDU 1542 —— Atlantis 【矩形面积并:扫描线】

#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#define left rt<<1
#define right rt<<1|1
using namespace std;

const int MAXN = 100 + 5;

struct Segment {
    double l, r, h;
    int s;
    Segment() {}
    Segment(double l, double r, double h, int s):l(l),r(r),h(h),s(s) {}
    bool operator < (const Segment& a) const {
        return h < a.h;
    }
} seg[MAXN << 1];

double len[MAXN << 3];
int add[MAXN << 3];
double x[MAXN << 1];

void pushup(int rt, int l, int r)
{
    if(add[rt])    len[rt] = x[r+1] - x[l];
    else if(l == r)    len[rt] = 0;
    else    len[rt] = len[left] + len[right];
}

void update(int ql, int qr, int x, int rt, int l, int r)
{
    if(ql <= l && r <= qr) {
        add[rt] += x;
        pushup(rt, l, r);
        return;
    }
    int m = (l + r) >> 1;
    if(ql <= m)    update(ql, qr, x, left, l, m);
    if(qr > m)    update(ql, qr, x, right, m+1, r);
    pushup(rt, l, r);
}

int Bsearch(double *x, int n, double key)
{
    int l = 0, r = n - 1;
    while(l <= r) { // [l, r]
        int m = (l + r) >> 1;
        if(x[m] == key)    return m;
        else if(x[m] < key)    l = m+1;
        else    r = m-1;
    }
}

int main ()
{
    int n, segNum, xNum, kase=1;
    double x1, y1, x2, y2, ans;
    while(scanf("%d", &n) != EOF && n) {
        segNum = xNum = 0;
        for(int i=0; i<n; i++) {
            scanf("%lf%lf%lf%lf", &x1, &y1, &x2, &y2);
            x[xNum++] = x1;
            x[xNum++] = x2;
            seg[segNum++] = Segment(x1, x2, y1, 1);
            seg[segNum++] = Segment(x1, x2, y2, -1);
        }
        sort(x, x+xNum);
        sort(seg, seg+segNum);

        int cur = 1;
        for(int i=1; i<xNum; i++) {  //去重
            if(x[i] != x[i-1])    x[cur++] = x[i];
        }
        xNum = cur;

        // 用下面的memset替代build 
        memset(add, 0, sizeof(add));
        memset(len, 0, sizeof(len));

        ans = 0;
        for(int i=0; i<segNum-1; i++) {
            int l = Bsearch(x, xNum, seg[i].l);
             //这里之所以要减1,是因为每一个下标都代表的是一个区间,比如下标l其实代表的是区间[l,l+1]
            int r = Bsearch(x, xNum, seg[i].r) - 1;
            if(l <= r)    update(l, r, seg[i].s, 1, 0, xNum-1);
            ans += len[1] * (seg[i+1].h - seg[i].h);
        }
        printf("Test case #%d\nTotal explored area: %.2lf\n\n", kase++, ans);
    }

    return 0;
}

该思路是通过该博客学会的:

http://www.cnblogs.com/scau20110726/archive/2013/04/12/3016765.html

特别感谢这位大神博主!撒花~

别只刷题了!我用834分经验告诉你,华为HCIP大数据考试(H13-723)这样准备更高效 本文分享了华为HCIP大数据认证(H13-723)834分通关的高效备考经验。通过分析考试动态、题库验证技巧和章节优先级策略,帮助考生超越单纯刷题,系统化掌握核心知识点。特别强调实时流处理和离线批处理等重点章节,提供黄金90分钟临场发挥策略,助力考生一次性通过考试。 阅读详情

相关推荐

【YOLOv7-环境搭建】PyTorch安装后输出版本显示No module named ‘Torch’的解决方法

【YOLOv7-环境搭建】PyTorch安装后输出版本显示No module named ‘Torch’的解决方法:①检查PyCharm导入的环境是否错误②添加Torch包

qq_59942266的博客 4969

poj_1151(Atlantis)

AtlantisTime Limit: 1000MSMemory Limit: 10000KTotal Submissions: 8189Accepted: 3228<br />DescriptionThere 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.

allenbilly的专栏 511

双层优化入门(1)—基本原理与求解方法(附matlab代码)

双层优化问题(Bilevel Programming Problems),也被称为双层规划,最早由Stackelberg与1934年在经济学相关研究中提出,因此也被称为Stackelberg问题。双层规划问题一般具有层次性、独立性、冲突性、优先性和自主性等特点。 本文介绍了双层优化的原理与求解方法,并提供了相应的matlab代码供参考学习。

配电网和matlab的博客 5万+

Atlantis

题目大意: 给出N个矩阵,矩阵会重叠,求矩阵围成的面积 SUCH AS: 黑色部分就代表所求的面积。 题目思路: 线段树扫面线,画个图,我们可以把矩阵变成这样一个图形 按照X轴进行排序,从左到右扫描,将各个不同颜色的长方形进行想家就可以得到答案 #include #include #include #include using namespace std;

十动然拒,不明觉厉 612

Unity性能优化 - 动态图集

Unity 动态图集是 Unity 引擎中用于处理游戏纹理优化的一种技术。本文介绍了什么是动态图集,动态图集的优缺点,以及提供了一套完整的代码供大家参考。

qq_33808037的博客 4839

AVL-Excite新手必看:5步搞定发动机阀系系统建模(附B站视频教程)

本文为AVL-Excite新手提供发动机阀系系统建模的5步详细指南,涵盖软件环境搭建、基本结构建立、关键参数设置、仿真分析及常见问题排查。通过清晰的步骤说明和实用技巧,帮助工程师快速掌握建模方法,并附有精选B站视频教程链接,便于实践学习。

weixin_29305313的博客 502

A - Atlantis(线段树)

题意给定多个矩形,会出现重叠的情况,问总面积是多少?解法采用了线段树+扫描线的做法,一些小技巧 离散化: 先用sort进行需要离散的数据排须,然后用unique进行去重复。 unique()函数的参数和sort函数一致,将重复的元素放到数组的最后面,返回值是最后一个unique的数地址+1。 这里面有个很莫名其妙的部分就是update的时候r要先减1,之后在进行区间长度计算的时候r再加回来,

Coldplay 461

青龙人形机器人硬件平台设计全解析:从构型到控制系统的实战指南

本文深度解析了青龙人形机器人硬件平台的设计全流程,从需求分析、构型设计到核心系统实现。文章详细阐述了其43个自由度的仿生构型、高动态性下肢设计、灵巧作业系统以及分布式控制架构,并探讨了旋转关节与直线关节等关键技术选型,为开发者提供了从理论到实践的完整硬件设计指南。

weixin_29248313的博客 380

Atlantis(线段树+扫描线+离散化)

Atlantis Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 12   Accepted Submission(s) : 4 Problem Description There are several ancien

sdau20163940的博客 1148

S7-1200 PLC PID功能 | 调节PID参数

S7-1200 PLC PID功能 | 调节PID参数

Robot_PLC_HMI_Automation 1万+

Codex 100个真实案例 - 用AI批量清洗Excel脏数据(10万行3分钟搞定)

每个做数据分析的人都被"脏数据"折磨过——空值、重复行、日期格式五花八门、手机号多一位少一位……手动清洗几千行就已经让人崩溃,更别提10万行了。本文将展示如何用 Codex 生成一套完整的 Python pandas 数据清洗工具,从读取Excel/CSV、识别脏数据、自动清洗、生成清洗报告,到可视化对比清洗前后的数据质量,全程自然语言驱动,10万行数据3分钟搞定!

yueyeguzhuo的专栏 87

hdu 1542 Atlantis 扫描线 矩形面积并

Atlantis Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 20693Accepted Submission(s): 8258 Problem Description There are several ancie...

KIDGIN7439的专栏 431

LAMMPS实例教程—In文件详解

本博文主要介绍专栏 《LAMMPS实例教程—In文件详解》, 针对于 Lammps 可分析的物理过程进行讲解,提供 In 文件以及后处理方法,持续更新。 目前分为8个专题: 1)力学专题、2)传热专题、3)相变专题、4)界面专题、5)吸附专题、6)流动专题、7)物性专题以及8)基础理论专题。

Rockyoung 3万+

hdu1542 Atlantis(矩形面积并+扫描线)

http://acm.hdu.edu.cn/showproblem.php?pid=1542 题意:给你n个矩形,求他们的周长面积并。 思路:看了两篇比较好的博客,推荐下第一个、第二个。求面积时要想用扫描线,首先要确定水平还是竖直方向。这里是从下往上扫描,由于横坐标较大所以对其离散化。离散化还是保存排序去重的步骤,重点是对这里扫描的理解。必须要注意的是,扫描线是可变的。提前用seg

Iguodala的博客 453

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

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

HDU1542 Atlantis 扫描线求矩形面积并 模板题

题意:给你平面内一些矩形的位置和大小,让你求面积之并(能看到的面积之和)。 思路:扫描线板子题,自己最开始看了看扫描线实现的思路自己莽着写了一个竟然过了,但是后来证明是这个题数据量小,但是数据量一大就会T掉。。。 所以老老实实又重新学了一遍扫描线。其实就是updata函数写的不对,总体思路还是离散化、建树、求面积。 要注意这里有一个小难点就是点和区间的对应。值得仔细琢磨一下。 #include&l...

枚举星星 229

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

HDU1542 Atlantis 扫描线 矩形面积并

HDU1542 Atlantis 扫描线 矩形面积并

YJSheep 485

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

HDU 1542 —— Atlantis 【矩形面积并:扫描线】

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=14795 #include #include #include string> #include #define left rt<<1 #define right rt<<1|1 using namespace std; const int MAX

AcIsFun的博客 578

HDU 1542"Atlantis"(线段树+扫描线求矩形面积并)

传送门 •题意   给你 n 矩形,每个矩形给出你 $(x_1,y_1),(x_2,y_2)$ 分别表示这个矩形的左下角和右上角坐标;   让你求这 n 个矩形并的面积;   其中$x \leq 10^{5} \ ,\ y \leq 10^{5}$; •题解   这类题的解决方法需要用到一个比较重要的算法--扫描线算法;   其实并不需要将扫描线算...

weixin_30267697的博客 211

hdu 1542 Atlantis(线段树进阶,扫描线,矩形面积并)

题意: 给n个坐标为实数的矩形,求它们的并面积。 思路: 1)扫描算法 扫描线是这样做的,用一个数组来存边,对每个矩形添加它的两条边,上边和下边,,然后所有边从下至上排序。。 扫描过程: 来一条边,如果是上边,把它覆盖的线段计数减1就行了。如果是下边则加1。增加的面积是当前计数不为0的线段长度之和 乘上 (当前边与下一条边纵坐标之差)。。 如右图所示,模拟一下就明白了 2)离散化

slowlight93的专栏 625

Hdu1542_Atlantis(扫描线+线段树求矩形面积并)

题意: 给你n个矩形的左下角坐标和右上角坐标,求矩形相交的面积。 思路: 先学习一下矩形面积并。矩形面积并 就是把这一堆矩形切分成不同的矩形条来处理,每个矩形条的高度就是相邻矩形条的高度之差,而长度就是当前扫描线经过的这些矩形的长度和(用线段树来统计),长度*高度就是这一小块的面积,这样一条一条处理,最终一大块不规则的图形就处理完了。 参考:https://blog.youkuaiyun.com/WhereI...

CY05627的博客 334

HDU 1542 Atlantis 线段树+扫描线+离散化 矩形面积并

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 diff...

zhangjinlei321的博客 245

HDU 1542——Atlantis(矩形面积并:线段树+扫描线)

Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 19526    Accepted Submission(s): 7850 Problem Description There are several ancient...

QuincyTan的博客 518

(HDU 1542) Atlantis 矩形面积并——扫描线

n个矩形,可以重叠,求面积并。 n<=100:   暴力模拟扫描线。模拟赛大水题。(n^2)   甚至网上一种“分块”:分成n^2块,每一块看是否属于一个矩形。   甚至这个题就可以这么做。 n<=100000   这就要到扫描线了。 之前一直不会。 不好处理的地方在于:不知道区间被覆盖怎么计算。。。。 像sum区间和一样计算??sum>区间长度也不一定完全包含...

weixin_30896825的博客 125

hdu1542 Atlantis (线段树扫描线,矩形覆盖面积并)

问题描述 有几个古希腊文本包含了对传说中的亚特兰蒂斯岛的描述。其中一些文本甚至包括该岛部分地区的地图。但不幸的是,这些地图描述了亚特兰蒂斯的不同区域。你的朋友比尔必须知道地图存在的总面积。你(不明智地)自愿编写一个程序来计算这个数量。 输入 输入文件由几个测试用例组成。每个测试用例都以一行开始,其中包含一个可用映射的整数n (1<=n<=100)。下面的n行描述了每个映射。每一行包含四...

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 270

HDU 1542 Atlantis 线段树扫描线求矩形并面积

HDU1542 思路:线段树扫描线模板。 扫描线求矩形并面积大致思路: 从下往上扫的话 ,需要先存下来矩形的上下边,按照y的大小排序,记录每条线段的左右端点l , r 以及高度 y , 下边对应区域就加1,上边减1,每次拿这条线段到下条线段的距离 * 区域总长度累加就是并的总面积。 过程大致就是下面这样,从下往上,遇到上下边就更新,求和。 本来看完题想着复习重敲下代码的,但是这题我二分找位置的时...

Dave_lzw的博客 356

HDU - 1542 Atlantis(线段树扫描线求矩形并的面积)

HDU - 1542 Atlantis(线段树扫描线求矩形并的面积) 线段树求矩形面积详解 Problem 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 des

Vmorish 719
上一篇: markdown 小试牛刀
下一篇: uva 11729 —— Commando War
AcIsFun
博客等级 码龄10年 1粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值