扫描线|离散化|线段树+二分

lc

扫描线模板(矩形面积并)

线段树+二分

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N = 2010;

// 边的事件结构体:存储扫描线的入边/出边信息
struct Edge {
ll x, y1, y2;
int k; //入边k=1(覆盖+1),出边k=-1(覆盖-1)
Edge() {}
Edge(ll x, ll y1, ll y2, int k) : x(x), y1(y1), y2(y2), k(k) {}
// 事件点排序规则:按x坐标升序,x相同则入边优先(保证先加后减,避免漏算)
bool operator<(const Edge& t) const {
returnx < t.x;
}
};

Edge e[N << 1];
ll y[N << 1]; // 存储所有y坐标,用于离散化
int cnt;

// 线段树:维护当前扫描线覆盖的y轴区间有效长度
struct Node {
int l, r;
int cnt; // 区间被覆盖的次数
ll len; // 区间的有效长度(被覆盖时的长度)
} tr[N << 3];

void build(int u, int l, int r) {
tr[u] = {l, r, 0, 0};
if (l == r) return;
int mid = l + r >> 1;
build(u << 1, l, mid);
build(u << 1 | 1, mid + 1, r);
}

// 向上更新:根据子节点和当前覆盖次数计算有效长度
void pushup(int u) {
if (tr[u].cnt) tr[u].len = y[tr[u].r + 1] - y[tr[u].l];
else if (tr[u].l == tr[u].r) tr[u].len = 0;
else tr[u].len = tr[u << 1].len + tr[u << 1 | 1].len;
}

// 线段树区间更新:修改覆盖次数
void update(int u, int l, int r, int k) {
if (tr[u].l >= l && tr[u].r <= r) {
tr[u].cnt += k;
pushup(u);
return;
}
int mid = tr[u].l + r >> 1;
if (l <= mid) update(u << 1, l, r, k);
if (r > mid) update(u << 1 | 1, l, r, k);
pushup(u);
}

// 计算n个矩形的面积并
ll rectangleArea(vector<vector<ll>>& rects) {
cnt = 0;
int n = rects.size();
for (auto& rect : rects) {
ll x1 = rect[0], y1 = rect[1], x2 = rect[2], y2 = rect[3];
// 1. 构建事件点:左边界是入边,右边界是出边
e[cnt++] = Edge(x1, y1, y2, 1);
e[cnt++] = Edge(x2, y1, y2, -1);
// 收集所有y坐标,用于后续离散化
y[cnt - 2] = y1;
y[cnt - 1] = y2;
}

// ========== 离散化代码 start
sort(y, y + cnt); // 排序y坐标
// 去重:得到离散化后的唯一y坐标数量
int m = unique(y, y + cnt) - y;
// ========== 离散化代码 end


sort(e, e + cnt); // 按x坐标升序排序事件点
// ========== 事件点排序

build(1, 0, m - 2); // 线段树的叶子节点对应y[i]到y[i+1]的区间
ll res = 0;
for (int i = 0; i < cnt; i++) {
// 相邻事件点的x差 × 当前有效长度 = 这一段的面积
if (i > 0) res += tr[1].len * (e[i].x - e[i - 1].x);
// 二分查找y1,y2对应的离散化下标
int l = lower_bound(y, y + m, e[i].y1) - y;
int r = lower_bound(y, y + m, e[i].y2) - y;
// 更新线段树:覆盖区间[l, r-1]
update(1, l, r - 1, e[i].k);
}
return res;
}

说明

1. 离散化作用:把大范围的 y 坐标映射到小范围的下标,避免线段树空间爆炸,是处理大坐标的必备操作
2. 事件点排序核心作用:保证扫描线从左到右依次处理,入边先于出边的规则能避免同一 x 位置先减后加导致的有效长度计算错误

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

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

相关文章

AI驱动的DevSecOps革命:Gitee如何重塑中国软件测试新范式

测试者的困境与破局契机 在数字化转型浪潮中&#xff0c;中国软件测试团队面临三重挑战&#xff1a;安全漏洞发现滞后、自动化测试覆盖率瓶颈、研发流程协同低效。传统DevSecOps工具链因技术栈割裂、合规适配不足&#xff0c;导致"安全左移"难以落地。而Gitee企业版…

Reddit宕机了吗?周二Reddit中断事件解析。

Reddit宕机了吗&#xff1f;周二Reddit中断事件解析。 1月13日周二&#xff0c;用户报告称这个热门网站及应用程序出现问题。 Reddit宕机了吗&#xff1f;截至本文撰稿时该网站运行正常&#xff0c;但在1月13日周二&#xff0c;当这个热门在线讨论平台出现短暂服务中断时&#…

超越注意力机制:从零探索视觉新范式V-Mamba,揭秘高效长序列建模的入门到实战

文章目录 从0探索视觉状态空间模型V-Mamba:入门到实战的趣味教程 一、V-Mamba:视觉领域的“效率王者” 二、核心模块:V-Mamba的“制胜法宝” 1. 2D选择性扫描(SS2D)模块 2. V-Mamba的架构设计 三、技术拆解:V-Mamba如何“看懂”图像 1. 2D选择性扫描的具体运作 2. 状态空…

UniApp App端无需企微SDK!通过URL Scheme拉起企业微信转发教程

前言&#xff1a;在 UniApp 开发中&#xff0c;若需实现 App 端拉起企业微信并完成内容转发&#xff0c;很多开发者会第一时间想到集成企业微信 SDK&#xff0c;但 SDK 集成步骤繁琐&#xff0c;还需处理原生插件适配问题。本文将分享一种更轻量的方案——无需集成企微 SDK&…

《Python 3.13移动GPU原生支持:边缘AI开发的核心技术突破与实践指南》

边缘AI开发长期受制于移动硬件的算力桎梏与上层语言的适配壁垒,移动GPU的并行计算潜力虽早被行业感知,却始终因缺乏高效的高级语言衔接层,导致多数场景只能退而求其次—要么采用极度轻量化的阉割版模型,牺牲精度换取实时性;要么依赖云端回传算力,陷入网络延迟与数据隐私的…

Gitee:中国开发者生态的基石与数字化转型的加速器

Gitee&#xff1a;中国开发者生态的基石与数字化转型的加速器 在数字经济蓬勃发展的当下&#xff0c;代码托管平台已成为软件开发领域的基础设施。作为中国领先的代码托管与协作平台&#xff0c;Gitee正通过其本土化优势、全流程开发工具链和企业级安全能力&#xff0c;重塑中国…

解决公共场所安全隐患:基于YOLO系列实现电动车精准识别,打造具有社会价值的毕业设计

文章目录 《深度学习实战:基于YOLO系列的公共场所电动车识别毕设全流程指南》 一、为什么选择“公共场所电动车识别”做毕设? 二、第一步:搞懂YOLO系列,选对“武器”再开工 1. YOLOv5:经典且易上手 2. YOLOv8:性能全面升级 3. YOLOv10:最新旗舰模型 三、第二步:数据准备…

测试左移不是口号!我让测试介入需求评审,上线缺陷减少70%

在软件测试领域&#xff0c;“测试左移”常被提及&#xff0c;却往往沦为空洞的口号。许多团队在传统瀑布模型或敏捷流程中&#xff0c;将测试视为开发后的“守门员”&#xff0c;导致缺陷在后期爆发&#xff0c;引发上线延期、客户投诉甚至业务损失。作为资深测试工程师&#…

《重构多模态认知逻辑:触觉数据驱动的智能系统升级指南》

传统多模态理解框架长期困于视觉与听觉的二元感知惯性,却忽略了触觉作为“体感认知最后一块拼图”的核心价值,这种感知断层直接导致智能系统在复杂交互场景中陷入“识别精准却决策失准”的困境。触觉数据携带的压力梯度、纹理反馈、形变回弹、温度传导等多维信息,是视觉的平…

学习日记day56

Day56_0113专注时间&#xff1a;目标是&#xff1a;5h30~6h。实际&#xff1a;4h20min每日任务&#xff1a;饭后的休息&#xff08;25min&#xff09;&#xff0c;学习间歇的休息&#xff08;15min&#xff09;都用手表计时器来监督40min二刷1道力扣hot100(如果是hard&#xff…

革新肺结节检测:Lung-DETR,用Transformer变体高效解决稀疏异常检测难题

文章目录 Lung-DETR:变形检测Transformer在稀疏肺结节异常检测中的创新实践——从框架解析到端到端实现的深度指南 第一章:数据基石——从LUNA16 CT扫描到可训练管道的精炼 第二章:模型铸魂——从DETR基线到Lung-DETR的变形升级 第三章:验证落地——从mAP曲线到临床部署的桥…

吐血推荐!8款AI论文工具测评,本科生写毕业论文必备

吐血推荐&#xff01;8款AI论文工具测评&#xff0c;本科生写毕业论文必备 为什么需要这份AI论文工具测评&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的本科生开始借助AI工具提升论文写作效率。然而&#xff0c;面对市场上琳琅满目的AI论文工具&#xff0c;如…

易企秀源码系统,轻松对接CRM、ERP及内部数据库

温馨提示&#xff1a;文末有资源获取方式是否曾因缺乏专业技术团队&#xff0c;而对制作炫酷的H5营销页面望而却步&#xff1f;是否在寻找一款既能实现强大功能&#xff0c;又能让运营、设计甚至市场人员轻松上手的解决方案&#xff1f;最新发布的V27.8版H5场景秀源码系统&…

千万不能错过!揭秘运城最强品牌策划团队,效果震撼超乎想象!

千万不能错过&#xff01;揭秘运城最强品牌策划团队&#xff0c;效果震撼超乎想象&#xff01;在当今竞争激烈的市场环境中&#xff0c;品牌策划已成为企业成功的关键因素之一。一个优秀的品牌策划团队能够帮助企业塑造独特的品牌形象&#xff0c;提升市场竞争力。在运城&#…

攻克三维肺部结节检测:基于3D Faster R-CNN实现高精度智能辅助诊断系统(全流程解析)

文章目录 毕设攻坚:3D Faster R-CNN实现肺部结节检测系统全流程,从CT影像到智能诊断 一、先懂“3D肺部结节检测”的毕设意义 二、技术拆解:3D Faster R-CNN的核心逻辑 1. 3D Faster R-CNN的架构解析 2. 肺部结节检测的核心挑战 三、实战:3D肺部结节检测系统的毕设级实现 1.…

基于SpringBoot的公共交通路线应用系统设计与实践

一、系统开发背景与需求 随着城市化进程加快&#xff0c;城市公共交通网络日益复杂&#xff0c;市民对便捷、精准的出行导航需求愈发迫切。传统公共交通查询方式&#xff0c;如纸质站牌、人工咨询等&#xff0c;存在信息更新不及时、查询效率低等问题&#xff0c;难以满足市民动…

定义新范式:FedU-Net——在隐私保护下实现多模态脑肿瘤精准分割

文章目录 FedU-Net:联邦学习赋能的多模态脑肿瘤分割框架——从隐私挑战到临床应用的完整实践路径 第一章:数据基石——从BraTS扫描到可训练管道的搭建 第二章:模型铸造——U-Net主干到联邦注入的渐进融合 第三章:验证与扩展——从热图到临床报告的落地桥接 尾声:你的FedU-…

解决网站禁止复制功能

1.有些网页文本需登录后复制2.可以直接跳过去1.直接F12打开控制台 2.选择elements > Event Listeners 3.找到Copy事件删除 4.删除后就可已正常复制了&#xff0c;ctrlV不行的话 可以右键复制

五步搞定YOLO-World模型训练:数据、标注、配置、训练、部署全指南

基于YOLO-world训练模型的完整教程:从数据准备到微调训练 前言 目标检测作为计算机视觉中的重要任务,在许多领域中具有广泛的应用,如自动驾驶、安防监控、人机交互等。YOLO(You Only Look Once)系列算法凭借其高效、快速的特点,已经成为了目标检测领域的主流方法之一。…

中国电网Java面试被问:Dubbo的服务目录和路由链实现

一、服务目录&#xff08;Directory&#xff09;核心设计 1. 服务目录的核心作用 图表 代码 复制 下载 全屏 graph TBA[服务消费者] --> B[服务目录Directory]B --> C[RegistryDirectory]B --> D[StaticDirectory]C --> E[服务发现]C --> F[配置变更监听]C …