当前位置: 首页 > news >正文

LeeCode AutoX-4 计算几何

题意

传送门 LeeCode AutoX-4 蚂蚁爬行

题解

枚举每一对几何图形,判断相交性,用并查集维护连通性即可。总时间复杂度 O ( n 2 + m ) O(n^2 + m) O(n2+m),其中 n n n 为几何图形数量, m m m 为查询数量。

根据几何图形性质分类讨论。

判断两圆相交,令 d d d 表示圆心距离, r 1 , r 2 ( r 1 ≤ r 2 ) r1,r2(r1\leq r2) r1,r2(r1r2) 分别为两圆半径,则充要条件为 r 2 − r 1 ≤ d ≤ r 1 + r 2 r2 - r1 \leq d \leq r1 + r2 r2r1dr1+r2

判断两线段相交,一类思路是计算出交点,在判断交点是否处于两条线段上;由于只用判断相交性,不用求交点,可以使用基于ccw函数的做法简单求解,具体而言,用端点表示的两条非平行的线段 ( p 1 , p 2 ) , ( q 1 , q 2 ) (p1,p2),(q1,q2) (p1,p2),(q1,q2),对其中任意线段 ( p 1 , p 2 ) (p1, p2) (p1,p2) 而言,另一条线段 ( q 1 , q 2 ) (q1, q2) (q1,q2) 的两个端点必然在 ( p 1 , p 2 ) (p1, p2) (p1,p2) 所在直线的两侧(或者至多一个端点位于直线上),此时可以通过叉积简单地进行判断。

判断线段与圆的相交性,若圆心到线段所在直线的最小距离大于半径,则不可能相交;反之,若线段存在位于圆上的端点,则相交;若线段存在位于圆内部的端点,则除了两个端点都位于圆内的情况,其他情况都相交;其余情况,圆心与线段两端点的连线都位于圆心与线段的垂线两侧,此时可以通过内积简单地进行判断。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using lll = __int128;
struct Point {ll x, y;Point operator+(Point o) {return {x + o.x, y + o.y};}Point operator-(Point o) {return {x - o.x, y - o.y};}ll dot(Point o) {return x * o.x + y * o.y;}ll det(Point o) {return x * o.y - o.x * y;}
};
struct DSU {vector<int> par;DSU(int n) : par(n) {iota(par.begin(), par.end(), 0);}int find(int x) {return par[x] == x ? x : (par[x] = find(par[x]));}void unite(int x, int y) {x = find(x), y = find(y);par[x] = y;}bool same(int x, int y) {return find(x) == find(y);}
};
class Solution {public:vector<bool> antPass(vector<vector<int>> &geometry, vector<vector<int>> &path) {int n = geometry.size();DSU dsu(n);auto on_seg = [&](Point &p, Point &q1, Point &q2) {return (q1 - p).det(q2 - p) == 0 && (q1 - p).dot(q2 - p) <= 0;};auto intersection = [&](Point &p1, Point &p2, Point &q1, Point &q2) {auto f = [&](Point &p1, Point &p2, Point &q1, Point &q2) {return (lll)(p1 - p2).det(q1 - p2) * (p1 - p2).det(q2 - p2) <= 0;};if ((p1 - p2).det(q1 - q2) == 0) {return on_seg(p1, q1, q2) || on_seg(p2, q1, q2) || on_seg(q1, p1, p2) || on_seg(q2, p1, p2);}return f(p1, p2, q1, q2) && f(q1, q2, p1, p2);};auto in_circle = [&](Point p, Point q, ll r) {return (p - q).dot(p - q) < r * r;};auto on_circle = [&](Point p, Point q, ll r) {return (p - q).dot(p - q) == r * r;};for (int i = 0; i < n; ++i) {for (int j = 0; j < i; ++j) {int n = geometry[i].size(), m = geometry[j].size();if (n == m) {if (n == 3) {ll dx = geometry[i][0] - geometry[j][0];ll dy = geometry[i][1] - geometry[j][1];ll r = geometry[i][2] + geometry[j][2];ll l = max(geometry[i][2], geometry[j][2]) - min(geometry[i][2], geometry[j][2]);if (dx * dx + dy * dy <= r * r && dx * dx + dy * dy >= l * l) {dsu.unite(i, j);}} else {Point p1 = {geometry[i][0], geometry[i][1]};Point p2 = {geometry[i][2], geometry[i][3]};Point q1 = {geometry[j][0], geometry[j][1]};Point q2 = {geometry[j][2], geometry[j][3]};if (intersection(p1, p2, q1, q2)) {dsu.unite(i, j);}}} else {auto a = geometry[i], b = geometry[j];if (a.size() == 3) {swap(a, b);}Point p1 = {a[0], a[1]};Point p2 = {a[2], a[3]};Point q = {b[0], b[1]};ll r = b[2];lll d = (p1 - p2).det(p1 - q);if (d * d <= (lll)(p1 - p2).dot(p1 - p2) * r * r) {int can = 0;if (on_circle(p1, q, r) || on_circle(p2, q, r)) {can = 1;} else if (in_circle(p1, q, r) || in_circle(p2, q, r)) {can = !(in_circle(p1, q, r) && in_circle(p2, q, r));} else if (((p1 - q).dot(p1 - p2) > 0) != ((p2 - q).dot(p1 - p2) > 0)) {can = 1;}if (can) {dsu.unite(i, j);}}}}}int m = path.size();vector<bool> res(m);for (int i = 0; i < m; ++i) {res[i] = dsu.same(path[i][0], path[i][1]);}return res;}
};

相关文章:

LeeCode AutoX-4 计算几何

题意 传送门 LeeCode AutoX-4 蚂蚁爬行 题解 枚举每一对几何图形&#xff0c;判断相交性&#xff0c;用并查集维护连通性即可。总时间复杂度 O ( n 2 m ) O(n^2 m) O(n2m)&#xff0c;其中 n n n 为几何图形数量&#xff0c; m m m 为查询数量。 根据几何图形性质分类讨…...

Vue3 动态设置 ref

介绍 在一些场景&#xff0c;ref设置是未知的需要根据动态数据来决定&#xff0c;如表格中的input框需要我们主动聚焦&#xff0c;就需要给每一个input设置一个ref&#xff0c;进而进行聚焦操作。 Demo 点击下面截图中的编辑按钮&#xff0c;自动聚焦到相应的输入框中。 &…...

fast lio 2 保存每一帧的点云PCD和里程计矩阵 Odom 在txt文件

修改了源代码的 laserMapping.cpp 文件,替换为下面的代码就可以保存了,注意里面有一个路径,需要修改为你的电脑的路径 // This is an advanced implementation of the algorithm described in the // following paper: // J. Zhang and S. Singh. LOAM: Lidar Odometry an…...

当前主流DDos方式有哪几类

随着互联网的普及和技术的进步&#xff0c;网络安全问题日益凸显。DDoS攻击作为其中一种常见且具破坏性的攻击方式&#xff0c;受到了广泛关注。小德将带领大家一起来了解当前流行的三种DDoS攻击方式。 1. 容量耗尽攻击 容量耗尽攻击是最常见也是最直接的DDoS攻击方式。攻击者通…...

神经网络常见评价指标AUROC(AUC-ROC)、AUPR(AUC-PR)

神经网络的性能可以通过多个评价指标进行衡量&#xff0c;具体选择哪些指标取决于任务的性质。以下是神经网络中常见的评价指标&#xff1a; 准确性&#xff08;Accuracy&#xff09;&#xff1a; 准确性是最常见的分类任务评价指标&#xff0c;表示模型正确预测的样本数占总样…...

Apache Doris安装部署

Apache Doris安装部署 版本&#xff1a; CentOS 7.6 Apache Doris 0.14.0 编译 选择合适的版本进行下载&#xff0c;此次选择0.14.0版本 下载 | Apache Doris 一、CentOS编译 1 安装依赖 sudo yum groupinstall Development Tools && sudo yum install maven c…...

Excel查询时用vlookup或者xlookup时,虽然用的参数选择的是精确匹配,但是发现不能区分大小写,应该如何解决?

Excel查询时用vlookup或者xlookup时&#xff0c;虽然用的参数选择的是精确匹配&#xff0c;但是发现不能区分大小写&#xff0c;应该如何解决&#xff1f; Index函数解决 INDEX([excel1.xlsx]Sheet1!$E:$E,MATCH(1,EXACT(G5,[excel1.xlsx]Sheet1!$E:$E)*1,0))重点说明&#x…...

4种经典的限流算法

0、基础知识 1000毫秒内&#xff0c;允许2个请求&#xff0c;其他请求全部拒绝。 不拒绝就可能往db打请求&#xff0c;把db干爆~ interval 1000 rate 2&#xff1b; 一、固定窗口限流 固定窗口限流算法&#xff08;Fixed Window Rate Limiting Algorithm&#xff09;是…...

<MySQL> 什么是数据库事务?事务该如何使用?

目录 一、事务的概念 二、事务的核心特性 三、事务操作中的常见BUG 3.1 脏读 3.2 不可重复读 3.3 幻读 四、隔离级别 五、使用事务 一、事务的概念 “事务”是指一组操作&#xff0c;在逻辑上是不可分割的&#xff0c;组成这组操作的各个语句&#xff0c;或者全部执行成…...

Linux 网络:PMTUD 简介

文章目录 1. 前言2. Path MTU Discovery(PMTUD) 协议2.1 PMTUD 发现最小 MTU 的过程 3. Linux 的 PMTUD 简析3.1 创建 socket 时初始化 PMTUD 模式3.2 数据发送时 PMTUD 相关处理3.2.1 源头主机发送过程中 PMTU 处理3.2.2 转发过程中 PMTUD 处理 4. PMTUD 观察5. 参考链接 1. 前…...

BatchNormalization:解决神经网络中的内部协变量偏移问题

ICML2015 截至目前51172引 论文链接 代码连接(planing) 文章提出的问题 减少神经网络隐藏层中的”内部协变量偏移”问题。 在机器学习领域存在“协变量偏移”问题,问题的前提是我们划分数据集的时候,训练集和测试集往往假设是独立同分布(i.i.d)的,这种独立同分布更有利于…...

DAC实验(DAC 输出三角波实验)(DAC 输出正弦波实验)

DAC 输出三角波实验 本实验我们来学习使用如何让 DAC 输出三角波&#xff0c;DAC 初始化部分还是用 DAC 输出实验 的&#xff0c;所以做本实验的前提是先学习 DAC 输出实验。 使用 DAC 输出三角波&#xff0c;通过 KEY0/KEY1 两个按键&#xff0c;控制 DAC1 的通道 1 输出两种…...

许多网友可能还不知道,升级到Windows 11其实没那么复杂,只要符合几个条件可以了

如果你的Windows 10电脑可以升级Windows 11,现在怎么办?有几种方法可以免费安装新的操作系统。以下是你的选择。 如果你想升级到Windows 11,你可以随时购买一台已经安装了操作系统的新电脑。然而,如果你目前的Windows 10 PC满足所有必要的升级要求,那么在Windows 11免费的…...

ubuntu下载conda

系统&#xff1a;Ubuntu18.04 &#xff08;1&#xff09;下载安装包 wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2021.11-Linux-x86_64.sh 报错错误 403&#xff1a;Forbidden 解决方法 wget -U NoSuchBrowser/1.0 https://mirrors.tuna.tsingh…...

重磅 | 进一步夯实生态建设,朗思科技与阿里龙蜥完成兼容性认证

近日&#xff0c;北京朗思智能科技有限公司&#xff08;以下简称“朗思科技”&#xff09;自主研发的数字员工产品与OpenAnolis龙蜥社区龙蜥操作系统&#xff08;Anolis OS&#xff09;8完成兼容性认证。测试结果显示&#xff0c;双方产品相互兼容&#xff0c;功能正常&#xf…...

Qt给控件添加图片

双击qrc文件&#xff0c;选择下面的addFiles&#xff0c;将图片添加进来&#xff0c;然后选中图片右键Select All 设置控件字符&#xff1a; ui.btnSet->setText(""); 设置资源&#xff1a; ui.btnSet->setStyleSheet("QPushButton{background-image:…...

3.6-Dockerfile语法梳理及最佳实践

WORKDIR是设置当前docker的工作目录 ADD 和 COPY 为了将本地的一些文件添加到docker image里面&#xff0c;ADD 和 COPY的作用特别像&#xff0c;但是ADD 和 COPY还有一些区别&#xff0c;ADD不仅可以添加本地文件到docker里面&#xff0c;还可以将文件在添加到docker image里面…...

springboot集成nacos并实现自动刷新

目录 1.说明 2.示例 3.自动刷新的注意点 1.说明 springboot项目中存在好多配置文件&#xff0c;比如配置数据信息&#xff0c;redis信息等等&#xff0c;配置文件可以直接放在代码&#xff0c;也可以放在像nacos这样的组件中&#xff0c;实现动态的管理&#xff0c;修改配置…...

java面试八股文2023完整版详解110题附带答案

以下是一份Java面试八股文2023&#xff0c;涵盖了Java编程语言的核心概念和常用技术&#xff0c;帮助你更好地准备面试。 1. Java语言有哪些特点&#xff1f; Java语言是一种面向对象的编程语言&#xff0c;具有简单、面向对象、分布式、多线程、动态等优点。它是一种跨平台的…...

微服务实战系列之Token

前言 什么是“Token”&#xff1f; 它是服务端生成的一串字符串&#xff0c;以作客户端进行请求的一个令牌&#xff0c;当第一次登录后&#xff0c;服务器生成一个Token便返回给客户端&#xff1b;以后客户端只携带此Token请求数据即可。 简言之&#xff0c;Token其实就是用户身…...

身份证OCR识别接口接入实战:Python/Java/PHP/C#四语言代码示例与踩坑指南

#身份证OCR, #OCR接口, #API接入, #Python示例, #Java示例, #PHP示例, #踩坑指南, #石榴智能, #实名认证, #图片识别 身份证OCR识别接口接入实战&#xff1a;Python/Java/PHP/C#四语言代码示例与踩坑指南 作者&#xff1a;石榴智能技术团队 一、前言 身份证OCR识别已经不是什…...

保姆级教程:在CentOS 7上用达梦8搭建DCA练习环境(附ulimit、VNC、ODBC全配置)

达梦8 DCA认证实战&#xff1a;CentOS 7环境搭建与调优全指南 在国产数据库技术快速发展的今天&#xff0c;达梦数据库作为核心产品之一&#xff0c;其DCA认证已成为众多从业者提升竞争力的重要选择。与理论为主的认证不同&#xff0c;DCA更注重实际操作能力&#xff0c;而一个…...

30岁裸辞后,我用两个月拿下AI应用认证,现在OFFER选择困难症犯了

30岁裸辞那天&#xff0c;我最怕的不是没收入&#xff0c;而是突然发现&#xff1a;过去积累的经验&#xff0c;正在被AI重新定价。以前会写方案、做表格、跟项目&#xff0c;算是职场硬通货&#xff1b;到了2026年&#xff0c;招聘JD里开始频繁出现AI工具应用、智能工作流、Pr…...

一次搞懂内存取证:用Volatility3和Cobalt Strike分析工具复现VNCTF‘来一把紧张刺激的CS’

实战内存取证&#xff1a;从Volatility3到Cobalt Strike信标分析全解析 在网络安全事件响应中&#xff0c;内存取证往往是发现高级威胁的最后一道防线。当攻击者使用文件无落地的技术时&#xff0c;传统的磁盘取证可能一无所获&#xff0c;而内存中却保留着攻击行为的完整痕迹。…...

警惕!AI正在悄悄重构全球攻防格局

警惕&#xff01;AI 正在悄悄重构全球攻防格局 热点聚焦 AI重构网络安全&#xff1a;全球巨头加速布局 2026年5月&#xff0c;全球网络安全领域迎来重大变革&#xff0c;AI技术正在重塑攻防格局。OpenAI发布专为网络安全防御打造的集成化AI平台Daybreak&#xff0c;将安全防…...

全链路压测实战:双十一级别的流量,我是这样扛住的

作为一名在质量保障领域摸爬滚打多年的测试工程师&#xff0c;我深知传统的单接口压测在如今分布式架构下的无力感。当业务流量达到双十一这种脉冲式、高并发的级别时&#xff0c;任何一个非核心链路上的“短板”都可能引发系统性的雪崩。全链路压测不再是选择题&#xff0c;而…...

孤舟笔记 互联网常用框架篇三 Dubbo是如何动态感知服务下线的?注册中心和服务端双保险

文章目录先说结论机制一&#xff1a;注册中心通知机制二&#xff1a;心跳检测机制三&#xff1a;连接事件感知机制四&#xff1a;定时拉取四种机制的协作回答技巧与点评加分回答面试官点评个人网站微服务环境下&#xff0c;服务实例随时可能上下线——重启、扩容、宕机……调用…...

Mysql:事务管理(中)

在前面的章节中&#xff0c;我们提到了 MVCC&#xff08;多版本并发控制&#xff09;&#xff0c;它巧妙地通过“版本快照”解决了“读-写”冲突&#xff0c;实现了非阻塞读。但如果两个事务同时执行 UPDATE 操作修改同一行数据&#xff0c;即 写-写&#xff08;Write-Write&am…...

从零到上机:我的第一个Quest 3空间锚点应用是如何跑起来的(附完整Unity工程)

从零到上机&#xff1a;我的第一个Quest 3空间锚点应用是如何跑起来的&#xff08;附完整Unity工程&#xff09;第一次戴上Meta Quest 3时&#xff0c;那种虚拟与现实交织的震撼感至今难忘。但作为开发者&#xff0c;更让我着迷的是如何让虚拟物体在真实空间中"记住"…...

Jupyter Notebook里跑argparse脚本总报错?一个空列表参数搞定ipykernel_launcher.py error

Jupyter Notebook中argparse报错的终极解决方案&#xff1a;空列表参数实战解析在数据科学和机器学习的工作流中&#xff0c;Jupyter Notebook因其交互式特性成为众多研究者的首选工具。然而&#xff0c;当我们尝试在Notebook中运行那些原本为命令行设计的Python脚本时&#xf…...