热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

teacherone的任务COCIApril20162nd

Task:Relay题目翻译有一座岛屿,旁边有若干条船。每当有一条船遇难,他就会给其他船发出“Mayday”信号,每个接到Mayday信号的船会向其他船发出Relay信号。

Task: Relay

题目翻译

有一座岛屿,旁边有若干条船。每当有一条船遇难,他就会给其他船发出“Mayday”信号,每个接到"Mayday"信号的船会向其他船发出"Relay"信号。两个船可以通信当且仅当两个船所在位置连线不穿过岛屿。岛屿可以近似为一个凸多边形,船可以近似为一个点。现在遇难的船为1号船,问有多少个船接收到了"Relay"信号或者"Mayday"信号。

船的数量、描述岛屿的凸多边形点数均 \(\le 10^5\)。


提交地址

https://www.luogu.com.cn/problem/U153541


题解


基本想法

首先考虑一个船可以向哪些船传达信号。考虑这个船给这个凸多边形做切线。

点A对凸多边形切线这样定义:A与凸多边形上一点连成的线与凸多边形没有交点。

如果A与凸多边形相切于点X与Y,那么有AX外和AY外还有XY外的点都可以被A看到。

如何求切线?考虑到如果A切多边形于点B,设其两边的点为C和D,那么必有 AC转到AB是逆时针 与 AB转到AD是逆时针 正确性不同。所以可以有一种 \(\mathcal O(n)\) 求切线的做法。

那么剩下的问题是处理收到"Relay"信号的船。考虑只要找到到两个“最靠边”的点,就可以给所有收到"Relay"信号的点发送信号了。所以只要找到最靠边的点即可。所谓最靠边的点,有两个限制:



  1. 切多边形的位置要尽量靠后。

  2. 切线与多边形的夹角尽量大。

(叙述不是很严谨)

考虑这样:每个点尝试向后推切线的位置,推不动就停止。这样复杂度是经过的节点数和经过的切线数量,是正确的。

然而这些思路都很好想,但是有一个非常重要的问题就是千万不要用解析几何实现!!!要不然需要分类讨论一坨稀屎。


计算几何实现

如果要判断顺时针还是逆时针,可以考虑使用向量的叉积。如果 \(a\) 与 \(b\) 的叉积为正,那么 \(a\) 转到 \(b\) 就是逆时针转,。否则就是顺时针。如果 \(a\) 的坐标定义为 \((x_1,y_1)\) ,\(b\) 的坐标定义为 \((x_2,y_2)\) ,那么 \(a\times b=x_1y_2-x_2y_1\) 。可能为一的核心就这一个吧。


代码

https://paste.ubuntu.com/p/qzkwTTq3FN/

写的时候注意画出来看看嗷!



推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • Linuxchmod目录权限命令图文详解在Linux文件系统模型中,每个文件都有一组9个权限位用来控制谁能够读写和执行该文件的内容。对于目录来说,执行位的作用是控制能否进入或者通过 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了开关稳压器设计中PCB布局布线的重要性,并提供了相应的准则。开关稳压器作为一种高效的电源,逐渐取代了线性稳压器。开关模式电源的工作原理是通过一定的开启时间和关闭时间来实现电压转换。开关频率并不是影响系统的最大因素,而开关转换的速度才是关键。在系统噪声方面,开关频率或其谐波可能会对系统产生影响。严格遵守PCB布局布线的准则,可以将开关模式电源的相关问题降到最小。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 可能原因是需要dash执行输入:sudodpkg-reconfiguredash并在出现的界面选择no或 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
author-avatar
谢諭宥
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有