UVa 746 Polygon Visibility

发布时间:2026/10/29 1:43:49

UVa 746 Polygon Visibility 题目描述给定两个互不相交的凸多边形非退化多边形顶点按顺时针顺序给出。需要求平面上所有点PPPPPP不在第一个多边形内部的集合使得存在QQQ属于第二个多边形且线段PQ‾\overline{PQ}PQ​的内部与第一个多边形相交。该集合的边界由两条无限直线以及第一个多边形上的一段有限线段组成。要求输出这两条无限直线的斜率若为垂直直线则输出VERTICAL以及第一个多边形上构成有限线段的所有顶点且顶点按顺时针顺序给出。输入格式每个测试用例包含以下内容第一行两个正整数NNN和MMM3≤N,M≤100003 \le N, M \le 100003≤N,M≤10000分别表示第一个和第二个多边形的顶点数。接下来NNN行每行两个整数表示第一个多边形的顶点坐标按顺时针顺序给出。接下来MMM行每行两个整数表示第二个多边形的顶点坐标按顺时针顺序给出。坐标均为111到100001000010000之间的整数。输入以一行0 0结束该行不处理。输出格式对于每个测试用例输出以下内容第一行Instance X:XXX为用例编号从111开始。第二行第一条无限直线的斜率保留三位小数若为垂直直线输出VERTICAL。接下来若干行第一个多边形上从第二个切点顺时针到第一个切点的所有顶点包含两端每行输出坐标x y。最后一行第二条无限直线的斜率格式同上。两条无限直线均为内公切线顺序无严格要求但顶点序列需与样例一致。样例输入3 3 10 20 20 20 10 10 10 7 5 5 7 5 5 7 4 3 20 19 25 15 20 10 15 15 10 20 10 10 5 15 0 0输出Instance 1: VERTICAL 10 20 20 20 10 10 0.000 Instance 2: 1.000 15 15 20 19 25 15 20 10 -1.000题目分析本题要求找出所有从外部观察第二个多边形时视线被第一个多边形遮挡的点集。从几何上看该点集被两条内公切线和第一个多边形的一段边界所围成。内公切线的定义为一条直线同时与两个凸多边形相切且两个多边形分别位于直线的两侧。两条内公切线将两个凸多边形分隔开从该区域内的点观察第二个多边形被第一个遮挡。因此问题的核心转化为给定两个凸多边形求它们的两条内公切线。由于多边形顶点按顺时针顺序给出内公切线的方向与切点位置相关。直接枚举所有顶点对判断是否构成内公切线时间复杂度为O(NM)O(NM)O(NM)对于N,MN, MN,M可达10410^4104不可接受。需要利用凸多边形的性质采用线性时间的旋转卡壳算法。解题思路内公切线的旋转卡壳求法对于两个凸多边形AAA和BBB我们希望找到一条直线使得AAA的所有顶点均在该直线的一侧BBB的所有顶点均在另一侧。设f1f 1f1表示AAA在直线左侧即叉积≥0\ge 0≥0BBB在右侧叉积≤0\le 0≤0f−1f -1f−1表示AAA在右侧BBB在左侧。每次调用internalTangent(A, B, f)返回一对切点索引(i,j)(i, j)(i,j)表示直线过点A[i]A[i]A[i]和B[j]B[j]B[j]是一条内公切线。算法从初始指针i0,j0i 0, j 0i0,j0开始通过迭代调整指针直到直线满足条件。调整规则如下若BBB的前驱或后继顶点使得A[i]A[i]A[i]与B[j]B[j]B[j]的连线不满足BBB在−f-f−f侧的要求即叉积符号错误则推进jjj。若AAA的前驱或后继顶点使得B[j]B[j]B[j]与A[i]A[i]A[i]的连线不满足AAA在fff侧的要求则推进iii并标记更新。重复上述过程直到一次完整的扫描中没有任何指针被推进此时得到一条内公切线。最后需要处理共线退化的特殊情况当AAA的下一个顶点恰好在直线上时如果f1f1f1则将iii推进一个单位如果f−1f-1f−1则将iii退后一个单位。这是为了确保输出的切点不会导致后续顶点序列出现重复或遗漏。调用两次分别传入f1f1f1和f−1f-1f−1即可得到两条不同的内公切线。输出构建得到两条切线后第一条切线对应f1f1f1第二条对应f−1f-1f−1。输出时先输出第一条切线的斜率然后从第一个多边形上的第二个切点即第二条切线的AAA端顺时针遍历到第一个切点即第一条切线的AAA端包含两端所有顶点最后输出第二条切线的斜率。斜率计算时若两点横坐标相同则输出VERTICAL否则计算(y2-y1)/(x2-x1)保留三位小数。由于浮点数精度问题当斜率绝对值小于10−310^{-3}10−3时将其强制置为000以避免输出-0.000。复杂度分析每次调用internalTangent的指针移动总次数不超过O(NM)O(NM)O(NM)因此单次调用为线性复杂度。两次调用总时间复杂度为O(NM)O(NM)O(NM)空间复杂度为O(NM)O(NM)O(NM)完全满足题目要求。代码实现// Polygon Visibility// UVa ID: 746// Verdict: Accepted// Submission Date: 2026-07-07// UVa Run Time: 0.000s//// 版权所有C2026邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;structpoint{intx,y;point(inta0,intb0):x(a),y(b){}pointoperator-(constpointo)const{returnpoint(x-o.x,y-o.y);}pointoperator(constpointo)const{returnpoint(xo.x,yo.y);}};longlongcross(point o,point a,point b){return1LL*(a.x-o.x)*(b.y-o.y)-1LL*(a.y-o.y)*(b.x-o.x);}pairint,intinternalTangent(vectorpointA,vectorpointB,intf){intn(int)A.size(),m(int)B.size();inti0,j0,update;do{update0;while(f*cross(A[i],B[j],B[(jm-1)%m])0||f*cross(A[i],B[j],B[(j1)%m])0){j(j1)%m;}while(f*cross(B[j],A[i],A[(in-1)%n])0||f*cross(B[j],A[i],A[(i1)%n])0){i(i1)%n;update1;}}while(update);if(f1cross(B[j],A[i],A[(i1)%n])0)i(i1)%n;if(f-1cross(B[j],A[i],A[(in-1)%n])0)i(in-1)%n;return{i,j};}voidtoSlope(point p,point q){intdxq.x-p.x,dyq.y-p.y;if(dx0)coutVERTICAL\n;else{doubleslope(double)dy/dx;if(fabs(slope)1e-3)slope0.0;coutfixedsetprecision(3)slope\n;}}intmain(){cin.tie(0),cout.tie(0),ios::sync_with_stdio(false);intn,m,cases1;while(cinnm,nm){vectorpointA(n),B(m);for(inti0;in;i)cinA[i].xA[i].y;for(inti0;im;i)cinB[i].xB[i].y;auto[i1,j1]internalTangent(A,B,1);auto[i2,j2]internalTangent(A,B,-1);coutInstance cases:\n;toSlope(A[i1],B[j1]);intnowi1;do{coutA[now].x A[now].y\n;now(now1)%n;}while(now!i2);coutA[i2].x A[i2].y\n;toSlope(A[i2],B[j2]);}return0;}总结本题是计算几何中求凸多边形内公切线的典型应用。关键技巧在于旋转卡壳利用凸多边形的单调性在线性时间内完成切线搜索避免了平方级枚举。方向控制通过参数fff控制两个多边形分别位于直线两侧从而可求出两条不同的内公切线。共线处理切线可能经过多边形顶点需小心处理共线情况确保输出顺序正确。浮点数精度斜率输出时对绝对值小于10−310^{-3}10−3的值强制归零避免输出-0.000这是浮点运算中常见的陷阱。该解法同时具备时间高效性与实现稳健性是解决此类几何问题的标准方法。
延伸阅读

更多相关文章

2026/10/29 1:43:49

OneNET云平台-物联云平台搭建

目录 一、注册账号、登录云平台 二、创建产品并设置参数 三、设置产品物模型 四、添加设备 五、生成token密码 时间戳参数 token生成工具 token密码 主要流程: 登录平台→创建产品→添加物模型→添加设备→根据平台参数生成token 一、注册账号、登录云平台 …

2026/10/29 2:53:53

Agent沙盒技术对比与实践指南

1. Agent沙盒技术概述在分布式系统和自动化流程领域,Agent沙盒已经成为关键技术基础设施。简单来说,Agent沙盒是一个隔离的执行环境,允许各种智能代理(Agent)在其中安全运行,同时限制其对主系统的访问权限。…

2026/10/29 2:53:53

线性代数知识点总结:行列式、矩阵、秩与线性方程组串讲

简介:一份面向高校学生与考研复习者的线性代数知识点总结文档,聚焦课堂要点梳理与考前查漏补缺,适合需要快速建立知识框架、回顾公式定理的读者。压缩包共1个docx文件,约572KB,内容以章节笔记形式组织,便于…

2026/10/29 2:53:53

Pallas与DeepHelix:两大AI引擎架构对比与应用场景解析

1. 项目概述:两大AI引擎的技术对决在AI工具开发领域,引擎架构的选择往往决定了产品的性能天花板。最近在开发者社区热议的Pallas和DeepHelix两大引擎,代表了当前降AI工具开发的两种主流技术路线。作为同时使用过这两个引擎的开发者&#xff0…

2026/10/29 2:53:53

Python项目标准化脚手架:Cookiecutter实战指南

1. 为什么Python项目需要标准化脚手架?每次启动新Python项目时,重复创建基础目录结构、配置文件的过程简直让人抓狂。我见过太多项目因为初期结构混乱导致的后续问题:模块导入路径错误、测试用例分散、依赖管理失控...更可怕的是,…

2026/10/29 2:53:52

Python项目脚手架工具指南:从入门到实战

1. 为什么每个Python开发者都需要项目脚手架 刚入行时我最头疼的就是每次新建Python项目都要手动创建一堆文件夹和文件。src、tests、docs、requirements.txt...这些重复劳动不仅浪费时间,还容易遗漏关键文件。直到发现Cookiecutter这类项目脚手架工具,…

2026/10/29 2:48:52

专科生论文写作工具评测与高效使用指南

1. 论文写作工具的价值与选择标准作为一名经历过论文写作煎熬的老学长,我深知专科生在毕业季面临的双重压力:既要完成实习工作,又要应付毕业论文。传统写作方式下,从选题到定稿往往需要消耗2-3个月时间,而专科生的学制…

2026/10/28 14:42:12

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/28 15:28:56

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/28 3:32:29

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/29 0:03:42

学生选课系统DFD图绘制指南:边界划分与分层校验实战

简介:文档以顶层与第一层DFD图为核心,完整刻画学生选课系统的逻辑模型,面向软件工程课程设计、系统分析学习及毕设前期建模人群。顶层图界定系统边界,外部实体包括管理员、教师和学生三类角色;第一层图进一步细化用户登…

2026/10/29 0:03:42

JIRA敏捷落地:Scrum角色权限、Sprint与燃尽图避坑指南

简介:围绕“基于JIRA的敏捷开发项目管理”这一主题,面向产品负责人、Scrum Master及研发测试成员,梳理Scrum角色分工、迭代流程与JIRA工具配置的对应关系,适合初、中级团队导入敏捷管理时参考。压缩包共1个docx文件,大…

2026/10/29 0:03:42

SEMI S8人机工程验收实战:从条款拆解到现场实测的完整指南

简介:面向半导体设备设计、制造与运维工程师及安全合规人员,这份资料聚焦SEMI标准体系下的设备安全规范,重点收录SEMI S8-0308《半导体制造设备人体工程学工程安全指南》。内容围绕设备设计原则、错误与事故预防、人体工程学适配三大主线展开…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑