扫描线算法 矩形面积并 线段树与扫描线结合

news/2025/11/7 16:49:01/文章来源:https://www.cnblogs.com/cute/p/19200211

关键是理解这里点对应的是一个区间,用来表示一段线段长度。

image

要解决矩形面积并问题,高效的方法是扫描线算法结合线段树离散化,能处理高达 105 个矩形的规模。

核心结论

扫描线算法通过 “竖线扫描 + 区间更新” 计算面积并,时间复杂度 O(nlogn),核心是将 y 轴坐标离散化,用线段树维护区间覆盖长度。

关键原理

  1. 扫描线思想:用垂直于 x 轴的直线从左到右扫描,记录矩形左右边界(左边界 + 1 标记,右边界 - 1 标记)。
  2. 离散化处理:y 轴坐标范围可能达 10^9,需将所有 y 坐标去重排序,映射为紧凑索引(减少线段树规模)。
  3. 线段树功能:维护 y 轴区间的覆盖次数和有效长度,支持区间更新(加减覆盖次数)和查询(当前有效覆盖长度)。

实现步骤

1. 数据预处理

  • 提取所有矩形的 y1、y2 坐标,去重后排序得到离散化数组。
  • 将每个矩形拆分为两条扫描线:左边界(x1,y1,y2,+1)和右边界(x2,y1,y2,-1)。
  • 按扫描线的 x 坐标升序排序(x 相同则先处理减标记,避免重复计算)。

2. 线段树实现

  • 节点存储:区间覆盖次数(cnt)、区间有效覆盖长度(len)。
  • 区间更新:给 [y1, y2) 区间的 cnt 加减 1,更新时根据 cnt 是否大于 0 维护 len(cnt>0 则 len 为区间长度,否则递归合并子节点 len)。
  • 注意:离散化后的 y 区间是 “左闭右开”,避免边界重复计算。

3. 扫描计算面积

  • 初始化前一条扫描线的 x 坐标(prev_x)和面积总和(ans)。
  • 遍历排序后的扫描线:
    1. 计算当前扫描线与 prev_x 的水平距离(dx = x - prev_x)。
    2. 若 dx>0,累加面积(ans += dx * 线段树查询的有效长度)。
    3. 用当前扫描线的标记更新线段树的 y 区间。
    4. 更新 prev_x 为当前 x 坐标。

https://www.bilibili.com/video/BV16x4y1a7Ro/
https://www.bilibili.com/video/BV1MX4y1Z7N5

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;const int MAXN = 2e5 + 10;  // n<=1e5,每条矩形拆2条线,共2e5条扫描线// 扫描线结构体:x坐标、y1、y2(原始坐标)、标记(+1左边界/-1右边界)
struct Line {int x, y1, y2, val;Line() {}Line(int x_, int y1_, int y2_, int val_) : x(x_), y1(y1_), y2(y2_), val(val_) {}// 排序规则:x升序,x相同则减标记在前(避免重复计算)bool operator<(const Line& rhs) const {if (x != rhs.x) return x < rhs.x;return val < rhs.val;}
};// 线段树节点:覆盖次数cnt、有效长度len
struct Node {int l, r, cnt;long long len;
} tree[MAXN << 2];  // 离散化后y坐标最多2e5个,线段树需4倍空间vector<int> ys;  // 存储所有y坐标,用于离散化// 构建线段树(l、r为离散化后的索引区间)
void build(int root, int l, int r) {tree[root].l = l;tree[root].r = r;tree[root].cnt = 0;tree[root].len = 0;if (l == r) return;int mid = (l + r) >> 1;build(root << 1, l, mid);build(root << 1 | 1, mid + 1, r);
}// 向上更新:根据子节点计算当前节点的有效长度
void push_up(int root) {int l = tree[root].l, r = tree[root].r;if (tree[root].cnt > 0) {// 覆盖次数>0,有效长度为原始y区间长度tree[root].len = ys[r + 1] - ys[l];//*** 右边要加1 *** } else if (l == r) {//下面都是无覆盖情况// 叶子节点且无覆盖,长度为0tree[root].len = 0;} else {// 非叶子节点,合并左右子节点长度tree[root].len = tree[root << 1].len + tree[root << 1 | 1].len;}
}// 区间更新:给离散化后的[y1_idx, y2_idx]区间加减val
void update(int root, int L, int R, int val) {int l = tree[root].l, r = tree[root].r;if (L <= l && r <= R) {tree[root].cnt += val;push_up(root);return;}int mid = (l + r) >> 1;if (L <= mid) update(root << 1, L, R, val);if (R > mid) update(root << 1 | 1, L, R, val);push_up(root);
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;vector<Line> lines;lines.reserve(2 * n);for (int i = 0; i < n; ++i) {int x1, y1, x2, y2;cin >> x1 >> y1 >> x2 >> y2;lines.emplace_back(x1, y1, y2, 1);lines.emplace_back(x2, y1, y2, -1);ys.push_back(y1);ys.push_back(y2);}// 离散化y坐标:去重+排序sort(ys.begin(), ys.end());ys.erase(unique(ys.begin(), ys.end()), ys.end());int m = ys.size();if (m <= 1) {  // 无有效y区间,面积为0cout << 0 << endl;return 0;}// 构建线段树(离散化索引范围0~m-2,对应ys[0]~ys[m-1]的区间)build(1, 0, m - 2);// 排序扫描线sort(lines.begin(), lines.end());long long ans = 0;int prev_x = -1;  // 前一条扫描线的x坐标for (auto& line : lines) {int x = line.x, y1 = line.y1, y2 = line.y2, val = line.val;if (prev_x != -1 && x > prev_x) {// 累加面积:水平距离 * 当前有效覆盖长度ans += 1LL * (x - prev_x) * tree[1].len;}// 找到y1和y2在离散化数组中的索引int l = lower_bound(ys.begin(), ys.end(), y1) - ys.begin();int r = lower_bound(ys.begin(), ys.end(), y2) - ys.begin() - 1;// *** 要减1 ***if (l <= r) {update(1, l, r, val);}prev_x = x;}cout << ans << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/958999.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

改善深层神经网络:第一周优化算法(二)——Mini-batch 梯度下降汇报总结

一、引言 在深度学习模型的训练过程中,优化算法起着至关重要的作用,它直接决定了模型参数更新的方式和效率,进而影响模型的收敛速度和最终性能。在改善深层神经网络的第一周学习中,我们深入探讨了多种优化算法,其…

有度即时通重拳打击电诈行为,守护企业信息安全

近年来,电诈活动已成为整个即时通讯行业面临的严峻挑战。只有积极构建安全防线,才能让企业用户安心使用,避免因电诈分子使用同类产品而受到牵连。为此,有度即时通开展了一系列扎实有效的工作。近年来,电诈活动已成…

基于pytorch卷积神经网络的汉字识别系统

基于pytorch卷积神经网络的汉字识别系统源代码如下(pycharm//附运行结果):import osimport shutilimport randomimport numpy as npimport torchimport torch.nn as nnimport torch.optim as optimfrom torch.utils…

制图-学习日志

lth 开始时间:2025-11-07 更新时间:2025-11-07 QGIS\Aerialod{{image.png(uploading...)}}

2025年热门成人自考机构推荐

摘要 2025年,成人自考行业持续蓬勃发展,随着职场竞争加剧和终身学习理念普及,越来越多成年人选择通过自考提升学历。本文基于行业数据和用户口碑,为您推荐2025年热门成人自考机构TOP5排行,并附上详细评测,帮助您…

实用指南:手写MyBatis第95弹:调试追踪MyBatis SQL执行流程的终极指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

SOCKS5代理:通用性与协议覆盖

核心优势: 协议通用性:标准化转发能力,支持 TCP 与 UDP,适配混合协议场景[1] 客户端兼容性:对浏览器、数据库客户端、消息队列、实时业务等多样化客户端友好 连接灵活性:长连接与会话保持策略灵活,适合持续链路…

口碑好的成人自考机构2025年推荐榜单

摘要 2025年,成人自考行业持续蓬勃发展,随着职场竞争加剧和终身学习理念普及,越来越多在职人士选择通过自考提升学历。行业数据显示,中国成人自考市场规模年增长率超15%,需求主要集中在灵活学习、可靠服务和高效拿…

2025年国内成人自考机构口碑推荐排行榜单:选择指南与深度解析

摘要 2025年成人自考行业持续增长,越来越多在职人士选择自考提升学历,以应对职场竞争。本文基于权威数据和用户口碑,为您推荐top5成人自考机构,重点介绍排名第一的机构优势,并提供表单参考,助您高效选择。行业发…

2025 年 11 月除锈剂厂家推荐排行榜,钢铁除锈剂,金属除锈剂,钢材除锈剂,不锈钢除锈剂,螺丝除锈剂,弹簧除锈剂,铝型材除锈剂公司推荐

在金属加工制造领域,除锈剂作为表面处理的关键材料,其性能直接影响产品质量和生产效率。随着工业技术迭代升级,除锈剂产品已从基础防锈功能发展为具备多功能特性的专业化学品,针对不同金属材质和应用场景的需求差异…

CANopen转Profinet是一种构建于控制局域网设备之上的协议网关

CANopen转Profinet是一种构建于控制局域网设备之上的协议网关 CANopen作为构建于控制局域网(Controller Area Network, CAN)之上的高层通信协议,其体系架构包含通信子协议与设备子协议。此协议在嵌入式系统领域获得…

2025 年 11 月喷头漏墨维修厂家推荐排行榜,理光喷头漏墨,京瓷喷头漏墨,精工喷头漏墨,喷绘机喷头漏墨维修公司推荐

在工业喷墨打印领域,喷头漏墨是影响生产效率和打印质量的关键问题。随着喷墨技术在陶瓷装饰、广告喷绘、工业标识等行业的广泛应用,喷头漏墨故障已成为设备维护中的常见挑战。不同品牌的喷头,如理光、京瓷、精工等,…

Cohen‘s Kappa系数:衡量分类一致性的黄金标准及其在NLP中的应用 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年国内成人自考机构口碑推荐榜单:如何选择靠谱的学历提升平台

摘要 随着终身学习理念的深入,2025年成人自考市场呈现快速增长态势,学历提升需求持续旺盛。本文基于行业数据和用户口碑,为您精选国内优质的成人自考机构,并提供详细的对比分析。本文还包含机构推荐表单,供有需要…

Spring Cloud Alibaba + Sentinel

Sentinel 在微服务世界里,每个服务就像一个小摊位,生意火爆时,人流汹涌,如果没有保护措施,小摊很容易被“压垮”。这时候,你就需要 Sentinel——微服务界的“护身符”,帮你抵御流量暴击、保护系统稳定运行。 本…

2025年11月星光喷头厂家推荐排行榜:专业选购与维护指南

在工业喷墨打印领域,星光喷头作为核心部件,其性能稳定性与使用寿命直接影响生产效率和产品质量。随着陶瓷、纺织、包装等行业的快速发展,对星光喷头1024、1024MC、1024SC、1024LA、1024MA、SA、XSA、XSC、600DPI等型…

德鲁克管理哲学:管理是知行统一的实践创新 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年 11 月食堂承包公司推荐排行榜,食堂承包商,食堂承包方案,大型食堂承包,专业餐饮服务与高效运营管理口碑之选

在当今快节奏的社会环境中,食堂承包服务已成为企业、学校、医院等机构后勤保障的重要组成部分。专业的食堂承包公司不仅能够提供多样化的餐饮方案,还能通过科学的管理体系确保食品安全与运营效率。随着行业标准的不断…

2025年双组份喷涂泵定做厂家权威推荐榜单:双组份喷漆机专用喷枪/无气喷涂机/高压无气喷涂泵专用喷枪源头厂家精选

在工业涂装领域,双组份喷涂泵作为精密涂覆的核心设备,其定制化能力与稳定性直接影响涂层质量与生产成本。行业数据显示,2025年全球双组份涂装设备市场规模增长率预计达12%,其中定制化泵组在汽车、航空航天等高端制…

智能充气泵方案:充气泵电机怎么选?怎么适配

这个问题切得很准,直接命中充气泵核心动力单元的选型关键!充气泵电机选型核心是“匹配充气需求+适配PCBA驱动”,需先按场景定电机类型,再通过参数匹配、驱动适配实现稳定运行。一、电机选型:先定类型,再挑参数1.…