UVa1308/LA2572 Viva Confetti

题目链接

         本题是2002年ICPC亚洲区域赛金沢(日本)赛区的H题

题意

        我已经把n个圆盘依次放到了桌面上。现按照放置顺序依次给出各个圆盘的圆心位置和半径,问最后有多少圆盘可见?如下图所示。

分析

       《训练指南》的题解:

        题目说“保证在对输入数据进行微小扰动后答案不变”,意味着圆盘的可见部分不会太小。不难发现,每个可见部分都是由一些“小圆弧”围成的,因此可以先求出所有小圆弧,然后判断每段小圆弧是否可见(在程序实现中,可以用圆弧中点代替整条圆弧进行判断)。小圆弧可见,意味着它所在的圆是可见的。接下来,对于所有可见的小圆弧,看看这段圆弧中点的正下方都有哪些圆盘,则其中最顶部的圆盘也是可见的(想一想,为什么)。
        如何求出所有小圆弧?所有圆两两求交点,则每个圆上任两个相邻交点之间的圆弧就是所求。需要注意的是,如果一个圆不和其他所有圆相交,则整个圆是一条所求圆弧。

        这个思路真的很巧,特此写一篇笔记加强印象,还有一些细节参见AC代码。

        这里给一份测试数据,以及我用python写的画图可视化分析数据的脚本,能方便看出每个圆被其上面有相交的那些圆的覆盖情况:

AC代码

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;

#define N 102
double a[N][N<<1], x[N], y[N], r[N], z = M_PI + M_PI; bool vis[N], esc[N]; int c[N], n;

double check(double x) {
    return x > M_PI ? x-z : (x < -M_PI ? x+z : x);
}

void judge(int i, double a) {
    double px = x[i] + r[i]*cos(a), py = y[i] + r[i]*sin(a);
    for (int j=i+1; j<n; ++j) if (sqrt((px-x[j])*(px-x[j])+(py-y[j])*(py-y[j])) < r[j]) return;
    vis[i] = 1;
    for (int j=i-1; j>=0; --j) if (sqrt((px-x[j])*(px-x[j])+(py-y[j])*(py-y[j])) < r[j]) {
        vis[j] = 1; return;
    }
}

void solve() {
    for (int i=0; i<n; ++i) cin >> x[i] >> y[i] >> r[i], c[i] = vis[i] = esc[i] = 0;
    for (int i=0; i<n; ++i) for (int j=i+1; j<n; ++j) {
        double dx = x[i]-x[j], dy = y[i]-y[j], d = sqrt(dx*dx + dy*dy);
        if (d <= max(r[i], r[j])-min(r[i], r[j])) {
            if (r[i] <= r[j]) esc[i] = 1;
            continue;
        }
        if (d < r[i]+r[j]) {
            double x = atan2(dy, dx), b = acos((d*d+r[j]*r[j]-r[i]*r[i])/d/r[j]/2),
                y = M_PI - acos((d*d+r[i]*r[i]-r[j]*r[j])/d/r[i]/2);
            a[j][c[j]++] = check(x+b); a[j][c[j]++] = check(x-b);
            a[i][c[i]++] = check(x+y); a[i][c[i]++] = check(x-y);
        }
    }
    for (int i=0; i<n; ++i) {
        if (esc[i]) continue;
        if (c[i]) {
            sort(a[i], a[i]+c[i]);
            judge(i, (a[i][c[i]-1] + a[i][0]) / 2 + M_PI);
            for (int j=c[i]-1; j>0; --j) judge(i, (a[i][j-1] + a[i][j]) / 2);
        } else vis[i] = 1;
    }
    int ans = 0;
    for (int i=0; i<n; ++i) if (vis[i]) ++ans;
    cout << ans << endl;
}

int main() {
    while (cin >> n && n) solve();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/315054.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity网络通讯学习

---部分截图来自 siki学院Unity网络通讯课程 Socket 网络上的两个程序通过一个双向的通信连接实现数据交换&#xff0c;这个连接的一端称为一个 Socket &#xff0c;Socket 包含了网络通信必须的五种信息 Socket 例子{ 协议&#xff1a; TCP 本地&#xff1a; IP &#xff…

Hive数据定义(1)

hive数据定义是hive的基础知识&#xff0c;所包含的知识点有&#xff1a;数据仓库的创建、数据仓库的查询、数据仓库的修改、数据仓库的删除、表的创建、表的删除、表的修改、内部表、外部表、分区表、桶表、表的修改、视图。本篇文章先介绍&#xff1a;数据仓库的创建、数据仓…

【国产之光】开年尝鲜——优秀的AI编码助手 Fitten Code

文章目录 前言1. 工具准备1.0 事先说明1.1 VSCode1.2 Fitten Code1.3 GitHub Copilot 2. 使用测评2.1 需求理解2.2 上下文理解 3. 总结推荐链接 开年尝鲜高质量国产AI编码助手——FittenCode 前言 2024年刚刚开局&#xff0c;清华大学 与 非十科技 就发布了全新的 VSCode AI…

Docker 介绍 及 支持的操作系统

Docker组成&#xff1a; Docker主机(Host)&#xff1a; 一个物理机或虚拟机, 用于运行Docker服务进程和容器, 也成为宿主机, node节点。 Docker服务器端(Server)&#xff1a; Docker守护进程, 运行Docker容器。 Docker客户端(Client)&#xff1a; 客户端使用docker命令或其他工…

搭建LNMP网站平台并部署Web应用

本章主要介绍&#xff1a; 安装Nginx安装MySQL安装PHP在LNMP平台中部署 Web 应用 构建LNMP网站平台就像构建LAMP平台一样&#xff0c;构建LNMP平台也需要Linux服务器&#xff0c;MySQL数据库&#xff0c;PHP解析环境&#xff0c;区别主要在Nginx 与 PHP的协作配置上&#xff0…

基于SPI的插件式开发实现方案之@AutoService+ServiceLoader介绍及Dolphinscheduler中的实际应用

1.插件化开发概述 插件化开发模式正在很多编程语言或技术框架中得以广泛的应用实践&#xff0c;比如大家熟悉的jenkins&#xff0c;docker可视化管理平台rancher&#xff0c;以及日常编码使用的编辑器idea&#xff0c;vscode等。 实现服务模块之间解耦的方式有很多&#xff0…

代码随想录二刷 |二叉树 | 二叉搜索树的最小绝对差

代码随想录二刷 &#xff5c;二叉树 &#xff5c; 二叉搜索树的最小绝对差 题目描述解题思路 & 代码实现递归法迭代法 题目描述 530.二叉搜索树的最小绝对差 给你一棵所有节点为非负值的二叉搜索树&#xff0c;请你计算树中任意两节点的差的绝对值的最小值。 示例&#…

10款热门的企业报表工具软件,看看哪款最适合?

1. Microsoft Office Excel&#xff1a;这款软件一般比较简单&#xff0c;适合处理小量数据&#xff0c;常被用来制作报表。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 2. VeryReport&#xff1a;这是一款由纯Java编写的报表软件&#xff0c;兼具数…

[易语言]使用易语言部署工业级人脸检测模型

【框架地址】 https://github.com/ShiqiYu/libfacedetection 【算法介绍】 Libfacedetection是一个开源的计算机视觉库&#xff0c;主要用于实时的人脸检测。它利用深度学习技术&#xff0c;特别是卷积神经网络&#xff08;CNN&#xff09;&#xff0c;实现了高精度的脸部定位…

知识库系统搭建不用愁,有这些工具就够了

对于企业来说&#xff0c;知识库不仅是存储和管理知识的出色工具&#xff0c;更是建立有效知识共享和团队合作的有力助手。好的知识库工具可以实现知识的分类、检索和分享&#xff0c;提升工程效率&#xff0c;降低内部沟通成本。对于追求效率的你&#xff0c;下面介绍的三款知…

每天刷两道题——第十四天

1.1矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用原地算法。 输入&#xff1a;matrix [[0,1,2,0],[3,4,5,2],[1,3,1,5]] 输出&#xff1a;[[0,0,0,0],[0,4,5,0],[0,3,1,0]] 原地算法&#xff08;…

Jetson_yolov8_解决模型导出.engine遇到的问题、使用gpu版本的torch和torchvision、INT8 FP16量化加快推理

1、前情提要 英伟达Jetson搭建Yolov8环境过程中遇到的各种报错解决&#xff08;涉及numpy、scipy、torchvision等&#xff09;以及直观体验使用Yolov8目标检测的过程&#xff08;CLI命令行操作、无需代码&#xff09;-CSDN博客和YOLOv8_测试yolov8n.pt&#xff0c;yolov8m.pt训…

Java十大经典算法—KMP

字符串匹配问题&#xff1a; 1.暴力匹配 public class ViolenceMatch {public static void main(String[] args) {String str1 "硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅谷你尚硅你好";String str2 "尚硅谷你尚硅你好";int index violenceMatch(str1, str2);S…

十二、QProgressBar的简单使用与样式优化(Qt5 GUI系列)

目录 一、设计需求 二、实现代码 三、代码解析 四、总结 五、扩展(自定义QProgressBar样式) 一、设计需求 在很多应用程序中&#xff0c;在执行费时操作时都会展示一个进度条来展示操作进行的进度。常见的场景&#xff0c;如&#xff1a;拷贝操作、安装操作以及卸载操作。…

JAVA安卓无线点餐系统源码

JAVA安卓无线点餐系统源码 本项目是带后台管理和客户端和SQL server数据库的完整项目&#xff0c;后台用SSH框架

【方法】PDF文件如何设置密码?

PDF文件可以通过浏览器打开查看&#xff0c;但如果想要设置密码保护&#xff0c;就需要用到相关的软件&#xff0c;下面分享两种常用的软件。 1. PDF编辑器 PDF编辑器除了可以编辑修改PDF文件&#xff0c;还可以用来设置密码。 以小编使用的PDF编辑器为例&#xff0c;通过PD…

“具身智能”浪潮中,达闼机器人的商业化“奇点”已然到来?

当前&#xff0c;人形机器人产业正在快速发展&#xff0c;而2023年必将会是载入史册的一年。 具体来看&#xff0c;2023年&#xff0c;AI技术大爆发&#xff0c;可在语言、视觉、运动控制、降低研发成本等多方面赋能人形机器人产业发展。与此同时&#xff0c;特斯拉、波士顿动…

基础面试题整理1

1.面向对象的特点 继承&#xff08;复用性&#xff09;、封装&#xff08;复用性&#xff09;、多态&#xff08;可移植性、灵活性&#xff09; 2.ArrayList与LinkedList区别 ArrayList和LinkedList都是实现了List接口 ArrayList底层是动态数组 LinkedList底层是链表&#…

Windows开机后,Docker失败:Commoncauses include access rights issues

这种错误看似已经跟你说很清楚了&#xff0c;但是看国外docker社区也提到这个问题&#xff0c;一大堆回答解决了别人的问题&#xff0c;但未必解决你的。我写自己的方案&#xff0c;可能也未必适合你&#xff0c;如果要说Root Cause根源就是windows的虚拟化功能开启的问题。 An…

基于SSM的驾校预约管理系统

基于SSM的驾校预约管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 详情 管理员界面 摘要 随着社会的不断发展&#xff0c;驾驶技能的需求逐渐增…