UVa1308/LA2572 Viva Confetti

news2024/11/16 15:31:17

题目链接

         本题是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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

87.乐理基础-记号篇-反复记号(一)反复、跳房子

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;86.乐理基础-记号篇-速度记号-CSDN博客 首先是反复记号表总结图&#xff1a; 当前是写前两个记号&#xff0c;其余记号后面写&#xff1a;这些反复记号最主要的目的很简单&#xff0c;还是为了节约纸张&#xff0c…

使用Linux安装Mysql Community Server 8.0.35

一、下载Mysql 官网&#xff1a;https://www.mysql.com/ 第一步&#xff1a;进入Linux官网&#xff0c;点击下载 第二步&#xff1a;点击MySQL Community (GPL) Downloads 第三步&#xff1a;进入页面&#xff0c;选择 MySQL Community Server 第四步&#xff1a;根据自己服务…

SpringBoot集成RabbitMq,RabbitMq消费与生产,消费失败重发机制,发送签收确认机制

RabbitMq消费与生产&#xff0c;消费失败重发机制&#xff0c;发送确认机制&#xff0c;消息发送结果回执 1. RabbitMq集成spring bootRabbitMq集成依赖RabbitMq配置RabbitMq生产者&#xff0c;队列&#xff0c;交换通道配置&#xff0c;消费者示例 2. RabbitMq消息确认机制消息…

LangChain 72 reference改变结果 字符串评估器String Evaluation

LangChain系列文章 LangChain 60 深入理解LangChain 表达式语言23 multiple chains链透传参数 LangChain Expression Language (LCEL)LangChain 61 深入理解LangChain 表达式语言24 multiple chains链透传参数 LangChain Expression Language (LCEL)LangChain 62 深入理解Lang…

Nginx——基础配置

和大多数软件一样&#xff0c;Nginx也有自己的配置文件&#xff0c;但它又有很多与众不同的地方&#xff0c;本帖就来揭开Nginx基础配置的面纱。 1、Nginx指令和指令块 了解指令和指令块有助于大家了解配置的上下文&#xff0c;下面是一个配置模板示例&#xff1a; 在这个配…

Transformer详解【学习笔记】

文章目录 1、Transformer绪论2、Encoders和Decoder2.1 Encoders2.1.1 输入部分2.1.2 多头注意力机制2.1.3 残差2.1.4 LayNorm&#xff08;Layer Normalization&#xff09;2.1.5 前馈神经网路 2.2 Decoder2.2.1 多头注意力机制2.2.2 交互层 1、Transformer绪论 Transformer在做…

第11章 GUI Page495~496 步骤三十一:另存为别的文件

当前的TrySaveFile(bool hint_on_dirty true)有两个特征无法满足“另存”的需求&#xff1a; 一&#xff0c;TrySaveFile仅在数据为“新”的时候才提问用户输入文件名。而“另存”总是要求用户输入一个文件名&#xff0c;多以它总应该弹出一个文件选择对话框&#xff0c;这也…

从零到一的方法:学习视频剪辑与嵌套合并技巧

随着社交媒体和数字技术的快速发展&#xff0c;视频制作已是常见的工作。那么如何批量嵌套合并视频呢&#xff1f;下面一起来看云炫AI智剪如何批量合并的方法。 嵌套合并后的视频截图查看。 批量嵌套合并的操作&#xff1a; 操作1、在云炫AI智剪上选择“嵌套合并”功能&#…

PHP版学校教务管理系统源码带文字安装教程

PHP版学校教务管理系统源码带文字安装教程 运行环境 服务器宝塔面板 PHP 7.0 Mysql 5.5及以上版本 Linux Centos7以上 系统介绍&#xff1a; 后台权限控制&#xff1a;支持多个管理员&#xff0c;学生管理&#xff0c;学生成绩&#xff0c;教师管理&#xff0c;文章管理&#x…

CSS3简单运用过渡元素(transition)

CSS3过渡 概念&#xff1a;在CSS3中&#xff0c;我们可以使用transition属性将元素的某一个属性从“一个属性值”在指定的时间内平滑地过渡到“另一个属性值”&#xff0c;从而实现动画效果。 CSS3变形&#xff08;transform)呈现的仅仅是一个结果&#xff0c;而CSS过渡&…

方波 离散傅里叶级数 MATLAB

%方波 离散时间傅里叶变换 L 5; N 10; k [-N/2:1:N/2]; %占空比 基本周期 离散时间的参数 xn [ones(1,L),zeros(1,N-L)]; %生成方波序列 XK dfs(xn,N); magXK abs([XK(N/21:N),XK(1:N/21)]); subplot(2,2,3); stem(k,magXK); axis([-N/2,N/2,-0.5,5.5]); xlabel(k); y…

麒麟OS + DM8数据库(Graalvm for JDK17) 测试

1、添加依赖 implementation com.dameng:DmJdbcDriver18:8.1.3.62 implementation com.baomidou:mybatis-plus-boot-starter:3.5.4 2、application.yml 数据源配置 spring: datasource: driver-class-name: dm.jdbc.driver.DmDriver #com.mysql.cj.jdbc.Driver url: jdbc:d…

Web前端 ---- 【Vue3】Proxy响应式原理

目录 前言 安装Vue3项目 安装 Proxy 语法格式 前言 从本文开始进入vue3的学习。本文介绍vue3中的响应式原理&#xff0c;相较于vue2中通过object.defineProperty&#xff08;vue2中的响应式&#xff09;来实现响应式&#xff0c;vue3中换成了Proxy来进行实现。 安装Vue3项目…

c#图片作为鼠标光标

图片转换为鼠标光标代码如下&#xff1a; private void Form1_Load(object sender, EventArgs e) {//button1.Cursor System.Windows.Forms.Cursors.Hand;Bitmap bmp new Bitmap("780.jpg");Cursor cursor new Cursor(bmp.GetHicon());button1.Cursor cursor;} …

腾讯云的域名使用阿里云服务器配置

因为近期云服务器到期了&#xff0c;之前的域名已经完成了备案不想轻易回收。于是就换了个厂商&#xff0c;从腾讯云换到了阿里云。但是因为两个厂商不互通。我又不想把域名转入到阿里云。所以就开启了配置之路&#xff0c;一路磕磕绊绊。给大家整理一份顺序&#xff0c;一步到…

在 Flutter 中创建圆角图像和圆形图像有多少种方法?

使用 Container 、 ClipRRect 、 CircleAvatar 、 Card 和 PhysicalModel 实现具有视觉吸引力的图像效果。 在 Flutter 应用 UI 设计中&#xff0c;圆形图像是常见的视觉元素。本博客探讨了使用不同技术实现圆形图像效果的各种方法。无论是使用网络图像、本地文件还是资源&…

Realm Management Extension领域管理扩展之系统架构

RME不仅仅是一组处理器功能,为了充分利用RME引入的功能,系统的其余部分需要提供支持。 下图显示了一个示例系统以及引入RME后受到影响的组件: 主存储器保护 RME启用的系统包括内存加密和可能的完整性。基线加密要求支持对外部内存进行加密,使用每个PA空间的单独加密密钥或…

便捷特惠的快递寄件快递物流折扣平台 ,通常都有什么常见问题?

首先&#xff0c;最重要的一点是怎么寄快递更便宜&#xff1f; 我们在寄快递时&#xff0c;尽量把包裹压缩空间大一点&#xff0c;这样在体积上面就会减少一部分的费用呢&#xff0c;另外就是选择有优惠的平台下单。例如在闪侠惠递平台下单&#xff0c;单单打折&#xff0c;单…

全面解析微服务

导读 微服务是企业应用及数据变革升级的利器&#xff0c;也是数字化转型及运营不可或缺的助产工具&#xff0c;企业云原生更离不开微服务&#xff0c;同时云原生的既要最大化发挥微服务的价值&#xff0c;也要最大化弥补微服务的缺陷。本文梳理了微服务基础设施组件、服务网格、…

Python 解决安装三方包失败的问题

pip 安装三方包失败&#xff0c;常见的情况有三种&#xff1a;不能访问源所在服务器&#xff1b;Python 版本不支持&#xff1b;和本地版本冲突。 不能访问源服务器 对于这张问题&#xff0c;有两种解决方法 # 方法一 pip config set global.index-url <源服务器> pip…