洛谷 P4631 - [APIO2018] 选圆圈(类平面最近点对分治法)
说实话在看题解之前我甚至不会复杂度低于平方的算法,毕竟我感觉圆覆盖这个东西……挺难用传统 DS 维护的吧(
事实上,如果你会平面最近点对的分治做法,那么你会发现那个做法对此题很有启发式作用。
首先考虑将平面划分成若干个网格状的正方形,具体来说假设当前半径最大的圆的半径为 ,那么我们就将网格划分为 的网格且刚好卡住半径最大的圆,这样我们遍历与一个圆可能相交的圆时,只需检查那些在周围 个区域中的圆即可。当最大圆的半径小于 时我们就重新划分。考虑这样做的时间复杂度,显然划分的轮数是 级别的,而在一轮中每个圆被访问次数是常数级别的,感性理解就是其周围 个格子中不会有太多两两不相交且半径 的圆。而为了定位到一个圆所在位置需要使用 map
,总复杂度 ,把 map
换成哈希表可以做到 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现