UVa 137 Polygons
题目描述题目给出了两个凸多边形这两个多边形可能重叠也可能不重叠。如果它们重叠重叠的程度和方式也会有所不同。要求编写一个程序读取两个凸多边形的顶点坐标按顺时针顺序给出并计算这两个多边形面积的“异或”exclusive or \texttt{exclusive or}exclusive or面积即只属于其中一个多边形所包围的区域面积。所求面积在题目提供的示意图中已用阴影标出。输入格式输入由多组数据组成每组数据包含两行第一行第一个多边形的顶点数n nn随后是n nn对整数表示按顺时针顺序的顶点坐标( x , y ) (x, y)(x,y)。第二行第二个多边形的顶点数m mm随后是m mm对整数表示按顺时针顺序的顶点坐标( x , y ) (x, y)(x,y)。所有坐标均为小于100 100100的正整数。输入以一行单独的0 00结束。输出格式对于每组数据输出所求面积格式为8 88位宽、保留2 22位小数的字段。所有结果在一行内输出字段间用空格分隔。样例输入3 5 5 8 1 2 3 3 5 5 8 1 2 3 4 1 2 1 4 5 4 5 2 6 6 3 8 2 8 1 4 1 4 2 5 3 0样例输出␣␣␣␣0.00␣␣␣13.50注样例输出中的空格用⊔ \sqcup⊔表示题目分析与解题思路问题转化两个多边形A AA和B BB的“异或”面积可以表示为X O R A r e a A r e a ( A ) A r e a ( B ) − 2 × A r e a ( A ∩ B ) XOR_{Area} Area(A) Area(B) - 2 \times Area(A \cap B)XORArea​Area(A)Area(B)−2×Area(A∩B)其中A r e a ( A ) Area(A)Area(A)和A r e a ( B ) Area(B)Area(B)分别表示两个多边形的面积。A r e a ( A ∩ B ) Area(A \cap B)Area(A∩B)表示两个多边形的交集面积。因此问题的关键在于计算两个凸多边形的交集面积。计算凸多边形交集两个凸多边形的交集仍然是一个凸多边形可能为空。我们可以使用半平面交Half-plane Intersection \texttt{Half-plane Intersection}Half-plane Intersection的方法来求交集将多边形视为一组半平面对于凸多边形的每条边将其视为一个有向线段方向为多边形顶点的顺时针顺序。该有向线段左侧即多边形内部的区域构成一个半平面。构建半平面集合将多边形A AA的每条边对应的半平面加入集合。将多边形B BB的每条边对应的半平面加入集合。求半平面交使用排序增量法求所有半平面的交集得到一个新的凸多边形交集多边形。如果交集为空则面积为0 00。计算面积使用叉积法Shoelace Formula \texttt{Shoelace Formula}Shoelace Formula计算多边形面积。算法步骤读取两个多边形的顶点坐标构建多边形对象。分别计算两个多边形的面积。构建两个多边形的半平面集合。求半平面交得到交集多边形。计算交集多边形面积。代入公式计算异或面积并输出。关键点由于输入坐标是整数计算过程中需使用浮点数以保证精度。注意处理精度误差例如使用EPSILON 1 × 10 − 7 \texttt{EPSILON} 1 \times 10^{-7}EPSILON1×10−7进行比较。输出格式要求8 88位宽、保留2 22位小数需使用setw(8)和setprecision(2)进行控制。复杂度分析设两个多边形的总边数为N NN则半平面交算法的时间复杂度为O ( N log ⁡ N ) O(N \log N)O(NlogN)空间复杂度为O ( N ) O(N)O(N)。由于顶点数不超过100 100100该算法可以高效运行。代码实现// Polygons// UVa ID: 137// Verdict: Accepted// Submission Date: 2017-12-20// UVa Run Time: 0.000s//// 版权所有C2016 - 2017邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;constintMAXV1100;constdoubleEPSILON1E-7;structpoint{doublex,y;point(doublex0,doubley0):x(x),y(y){}pointoperator(point p){returnpoint(xp.x,yp.y);};pointoperator-(point p){returnpoint(x-p.x,y-p.y);};pointoperator*(doublek){returnpoint(x*k,y*k);};pointoperator/(doublek){returnpoint(x/k,y/k);};};typedefvectorpointpolygon;doublecross(point a,point b){returna.x*b.y-a.y*b.x;}structline{point a,b;doubleangle;};doublecp(point a,point b,point c){returncross(b-a,c-a);}boolcw(point a,point b,point c){returncp(a,b,c)-EPSILON;}boolcmpLine(line p,line q){if(fabs(p.angle-q.angle)EPSILON)returncw(p.a,p.b,q.a);returnp.angleq.angle;}boolcmpAngle(line p,line q){returnfabs(p.angle-q.angle)EPSILON;}boolparallel(line p,line q){returnfabs((p.a.x-p.b.x)*(q.a.y-q.b.y)-(q.a.x-q.b.x)*(p.a.y-p.b.y))EPSILON;}pointgetIntersection(line p,line q){point p1p.a;doublescale((p.a.x-q.a.x)*(q.a.y-q.b.y)-(p.a.y-q.a.y)*(q.a.x-q.b.x))/((p.a.x-p.b.x)*(q.a.y-q.b.y)-(p.a.y-p.b.y)*(q.a.x-q.b.x));p1.x(p.b.x-p.a.x)*scale;p1.y(p.b.y-p.a.y)*scale;returnp1;}linepointToLine(point a,point b){line lr;lr.aa,lr.bb,lr.angleatan2(b.y-a.y,b.x-a.x);returnlr;}doublearea(polygonpg){if(pg.size()3)return0.0;doubleA0.0;intnpg.size();for(inti0,j(i1)%n;in;i,j(i1)%n)A(pg[i].x*pg[j].y-pg[j].x*pg[i].y);returnfabs(A/2.0);}polygonhalfPlaneIntersection(line*sides,intnLine){polygon pg;line deq[MAXV];sort(sides,sidesnLine,cmpLine);nLineunique(sides,sidesnLine,cmpAngle)-sides;intbtm0,top1;deq[0]sides[0],deq[1]sides[1];for(inti2;inLine;i){if(parallel(deq[top],deq[top-1])||parallel(deq[btm],deq[btm1]))returnpg;while(btmtopcw(sides[i].a,sides[i].b,getIntersection(deq[top],deq[top-1])))top--;while(btmtopcw(sides[i].a,sides[i].b,getIntersection(deq[btm],deq[btm1])))btm;deq[top]sides[i];}while(btmtopcw(deq[btm].a,deq[btm].b,getIntersection(deq[top],deq[top-1])))top--;while(btmtopcw(deq[top].a,deq[top].b,getIntersection(deq[btm],deq[btm1])))btm;if(top(btm1))returnpg;for(intibtm;itop;i)pg.push_back(getIntersection(deq[i],deq[i1]));if(btm(top1))pg.push_back(getIntersection(deq[btm],deq[top]));returnpg;}voidexclusiveOr(polygona,polygonb){doubleareaAarea(a),areaBarea(b);line sides[MAXV];intnLine0;for(inti0;ia.size()-1;i)sides[nLine]pointToLine(a[i1],a[i]);sides[nLine]pointToLine(a[0],a.back());for(inti0;ib.size()-1;i)sides[nLine]pointToLine(b[i1],b[i]);sides[nLine]pointToLine(b[0],b.back());polygon chalfPlaneIntersection(sides,nLine);doublearea1area(c);doublearea2areaAareaB-2*area1;coutfixedsetw(8)setfill( )setprecision(2)(area21e-9);}intmain(){intn;doublexi,yi;while(cinn,n0){polygon a,b;for(inti1;in;i){cinxiyi;a.push_back(point(xi,yi));}cinn;for(inti1;in;i){cinxiyi;b.push_back(point(xi,yi));}exclusiveOr(a,b);}cout\n;return0;}总结本题的关键在于将问题转化为求两个凸多边形的交集面积并利用半平面交算法高效求解。计算几何问题中需特别注意精度处理和边界条件。代码实现中使用了经典的排序增量算法求半平面交并利用叉积法计算多边形面积最终通过公式得到异或面积。该算法在时间和空间上均能满足题目要求且代码结构清晰便于理解和调试。

相关新闻

计算机毕业设计|基于springboot + vue智能办公系统(源码+数据库+文档)

计算机毕业设计|基于springboot + vue智能办公系统(源码+数据库+文档)

智能办公 目录 基于springboot vue智能办公系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于springboot vue智能办公系统 一、前言 博主介绍:✌️大…

2026/7/10 11:49:23 阅读更多 →
AI短剧创富新风口,零门槛智能创作源码系统,带完整的搭建部署教程

AI短剧创富新风口,零门槛智能创作源码系统,带完整的搭建部署教程

温馨提示:文末有资源获取方式在AI视频模型技术飞速进步的当下,短剧创作领域正经历一场颠覆性变革。传统影视制作的高壁垒被彻底打破,全民创作与创富的时代大门已然开启。数据显示,仅2025年下半年,播放量破千万的AI短剧…

2026/7/11 1:46:29 阅读更多 →
计算机毕业设计|基于springboot + vue个人记账系统(源码+数据库+文档)

计算机毕业设计|基于springboot + vue个人记账系统(源码+数据库+文档)

个人记账 目录 基于springboot vue个人记账系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于springboot vue个人记账系统 一、前言 博主介绍:✌️大…

2026/7/7 1:37:18 阅读更多 →

最新新闻

【SpringAI 入门06】传统应用和大模型应用

【SpringAI 入门06】传统应用和大模型应用

结合之前我们讨论过的AI大模型落地等相关技术背景,传统应用和大模型应用在技术逻辑、开发门槛、适用场景等方面存在显著差异,各自有明确的定位和特点: 一、传统应用 ‌核心定义‌:以明确规则、固定逻辑为核心的应用&#xff0c…

2026/7/11 6:02:37 阅读更多 →
大模型提示工程攻击:从可信场景到恶意执行的五步推演

大模型提示工程攻击:从可信场景到恶意执行的五步推演

1. 这不是“黑客攻击”,而是大模型推理链的系统性失守 最近一条技术圈刷屏的消息是:“黑客成功‘欺骗’ChatGPT、Grok、谷歌,诱导其辅助安装恶意软件”。标题里用引号强调“欺骗”,本身就暴露了问题的本质——这不是传统意义的漏洞…

2026/7/11 6:00:36 阅读更多 →
S-R与D锁存器Verilog建模:3种电路结构对比与亚稳态规避

S-R与D锁存器Verilog建模:3种电路结构对比与亚稳态规避

S-R与D锁存器Verilog建模:3种电路结构对比与亚稳态规避在数字电路设计中,锁存器作为基础存储单元,其可靠性和性能直接影响整个系统的稳定性。本文将深入探讨三种典型锁存器的Verilog实现方案,通过可综合代码示例、仿真波形分析和亚…

2026/7/11 5:58:35 阅读更多 →
小程序制作费用要多少?认证、开发方式、备案与后续维护成本说明

小程序制作费用要多少?认证、开发方式、备案与后续维护成本说明

本文以常见小程序制作方式为例,梳理认证、开发、备案和维护成本;文中价格仅作参考,具体以平台后台或服务商报价为准。很多人想做小程序,但最关心的就是小程序制作费用要多少,要么怕报高价被坑,要么贪便宜踩…

2026/7/11 5:56:35 阅读更多 →
PIC18F45K22与PAM8904构建低功耗警报系统

PIC18F45K22与PAM8904构建低功耗警报系统

1. 项目概述与核心组件选型在工业控制、智能家居和物联网设备中,可靠的通知系统是确保用户及时获取关键信息的基础设施。我最近完成了一个基于PIC18F45K22微控制器和PAM8904压电驱动器的通用警报系统项目,这个组合在功耗、成本和灵活性方面展现出独特优势…

2026/7/11 5:56:35 阅读更多 →
可降解电子皮肤助力伤口监测

可降解电子皮肤助力伤口监测

医疗设备正在向更加智能和环保的方向发展。近年来,柔性电子技术与生物材料结合,催生出新型智能伤口监测设备。这类电子皮肤可以集成微型传感器,对伤口环境中的温度、酸碱度以及部分生理指标进行监测,并通过无线方式传输数据&#…

2026/7/11 5:56:35 阅读更多 →

日新闻

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 想要让AI图像生成真正听从你的指挥吗&…

2026/7/11 0:02:12 阅读更多 →
PIC18F45K42驱动EPT-14A4005P压电蜂鸣器方案详解

PIC18F45K42驱动EPT-14A4005P压电蜂鸣器方案详解

1. 项目背景与核心需求 在工业控制、安防系统和智能家居等领域,可靠的声音警报系统是不可或缺的基础组件。传统蜂鸣器存在音量不足、音质模糊等问题,而基于压电陶瓷技术的EPT-14A4005P蜂鸣器配合PIC18F45K42微控制器,能够构建一套适应性强、音…

2026/7/11 0:04:12 阅读更多 →
大模型推理中的算子融合优化:LayerNorm + Attention 的 CUDA Kernel 手写与验证

大模型推理中的算子融合优化:LayerNorm + Attention 的 CUDA Kernel 手写与验证

大模型推理中的算子融合优化:LayerNorm Attention 的 CUDA Kernel 手写与验证 一、GPU 利用率 30%:分开的算子吃掉所有带宽 推理服务的 GPU 利用率监测显示一个反直觉的现象:计算核心(SM)利用率不到 30%,但…

2026/7/11 0:04:12 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/10 19:03:29 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/9 21:41:05 阅读更多 →

月新闻