[COCI2022-2023#1] Berilij 题解

推荐在 cnblogs 上阅读。

Solution

P9030 [COCI2022-2023#1] Berilij

本题解转载翻译自官方题解:COCI 2022/2023 CONTEST 1

Part 1

让我们定义图形 G G G,顶点代表飞船,边代表两艘飞船外部接触的情况。此外,让边的边权成为它所连接的圆之间的距离。

现在的任务等同于为顶点找到非负值,使得每条边所连接的两个顶点值之和等于这条边的边权,其中顶点值的平方和尽可能小。

如果顶点 ( i , j ) (i, j) (i,j) 与边权为 w i , j w_{i,j} wi,j 的边相连,则顶点值的条件 v i ≥ 0 v_i \geq 0 vi0 v j ≥ 0 v_j \geq 0 vj0 v i + v j = w i , j v_i + v_j = w_{i,j} vi+vj=wi,j 成立。

Part 2

在 Subtask 1 中, G G G 是一个奇环。由于我们可以计算出每条边的值 w i , j w_{i,j} wi,j,所以我们可以唯一确定环中第二个顶点的值。

现在我们尝试将第一个顶点的值增加 x x x。为了满足条件,我们现在需要减少第二个顶点的值,然后增加第三个顶点的值……以此类推,直到我们绕回第一个顶点,新的条件是它的值必须是 a − x a-x ax

由于 x = a − x x = a - x x=ax,我们可以唯一确定 x x x x = a 2 x = \frac{a}{2} x=2a

现在我们只需检查将 a 2 \frac{a}{2} 2a 替换为第一个顶点的值是否会导致所有其他顶点的值为非负值。

Part 3

在 Subtask 3 中, G G G 是一个森林,但只需对每棵树分别求解即可。

为了满足任务的条件,我们现在可以唯一确定每个顶点 i i i 的值为线性多项式 ± x + c i \pm x + c_i ±x+ci,其中 c i c_i ci 是一个常数,其值等于从顶点 i i i 到根的各条边的交替边权之和。

由于每个值都必须是非负值,因此 x + c i x + c_i x+ci 的顶点为 x x x 设定了下限,而 − x + c i -x + c_i x+ci 的顶点为 x x x 设定了上限。如果上限小于下限,则无解。为了确定顶点值平方和最小的 x x x,让我们求出每个顶点的线性多项式的平方和。结果是二次多项式 a x 2 + b x + c ax^2 + bx + c ax2+bx+c

注意, a a a 等于树的大小,因此二次多项式的最小值为 x = − b 2 a x =-\frac{b}{2a} x=2ab。由于这个表达式中没有使用 c c c,而 b b b 等于每个顶点的 − 2 s i c i -2s_ic_i 2sici 之和,其中 s i s_i si 是多项式 ± x + c i \pm x + c_i ±x+ci x x x 前面的符号,因此我们可以计算出 − b 2 a -\frac{b}{2a} 2ab,而无需将任何数字平方。如果 x = − b 2 a x = -\frac{b}{2a} x=2ab 在下限和上限之间,则 x x x 就是我们的解,否则我们取上限或下限中更接近 − b 2 a -\frac{b}{2a} 2ab 的值。

Part 4

对于完整的解决方案,让我们按照 Subtask 3 的解决方案来解决任意生成树上每个分量的任务。

我们注意到,在 Subtask 3 的解法中,从根开始偶数深度的每个顶点的多项式是 x + c i x + c_i x+ci,而奇数深度的每个顶点的多项式是 − x + c i -x + c_i x+ci。由于偶环连接不同深度奇偶性的顶点,它们只增加了 ( + x + c i ) + ( − x + c j ) = w i , j (+x+c_i)+(-x+c_j ) = w_{i,j} (+x+ci)+(x+cj)=wi,j 形式的条件,换句话说 c i + c j = w i , j c_i + c_j = w_{i,j} ci+cj=wi,j。奇环连接深度奇偶性相同的顶点,并增加了 ( ± x + c i ) + ( ± x + c j ) = w i , j (\pm x + c_i) + (\pm x + c_j ) = w_{i,j} (±x+ci)+(±x+cj)=wi,j 形式的条件,换句话说, ± x = 1 2 ( w i , j − c i − c j ) \pm x =\frac{1}{2} (w_{i,j} - c_i - c_j) ±x=21(wi,jcicj),与 Subtask 1 一样, x x x 的解只有一个。

时空分析

所述算法的时间复杂度为 O ( n + m ) O(n+m) O(n+m)。另外,该任务也可以通过更好的三元搜索实现来解决,复杂度为 O ( ( n + m ) l o g ( C ϵ − 1 ) ) O((n+m)log(C\epsilon ^{-1})) O((n+m)log(Cϵ1)),其中 C C C 为坐标的最大绝对值 C = 1 0 4 C = 10^4 C=104 ϵ \epsilon ϵ 为所需精度。

代码

#include<bits/stdc++.h>
using namespace std;

#define int long long
#define ld long double
#define pb push_back
#define ft first
#define sd second
#define po(x) ((x)*(x))

const int MAXN=1e5+5;
const ld eps=1e-8;

int n,m;
ld sz[MAXN];
ld ans[MAXN];
ld vl[MAXN],A,B,C;
ld b[MAXN],c[MAXN];
ld lf[MAXN],rg[MAXN];
int rot[MAXN],dep[MAXN];
bool fitr[MAXN],vis[MAXN];
vector<int> Rt;
pair<ld,ld> a[MAXN];
struct edge
{
    int u,v,nxt;
    bool ontr;
    ld w;
}E[MAXN];
int su=1,hd[MAXN];

void add(int u,int v,ld w)
{
    E[++su]={u,v,hd[u],0,w},hd[u]=su;
}

ld dis(int x,int y)
{
    return sqrt(po(a[x].ft-a[y].ft)+po(a[x].sd-a[y].sd));
}

void findtree(int x,int rt)
{
    sz[rt]++;
    rot[x]=rt;
    fitr[x]=1;
    for(int i=hd[x];i;i=E[i].nxt)
    {
        int v=E[i].v;
        ld d=E[i].w;
        if(fitr[v]) continue;
        E[i].ontr=E[i^1].ontr=1;
        dep[v]=dep[x]+1;
        vl[v]=d-vl[x];
        C+=po(vl[v]);
        if(dep[v]&1)
            rg[rt]=min(rg[rt],vl[v]),b[rt]-=2*vl[v];
        else
            lf[rt]=max(lf[rt],-vl[v]),b[rt]+=2*vl[v];
        if(rg[rt]+eps<=lf[rt])
        {
            puts("NE");
            exit(0);
        }
        findtree(v,rt);
    }
}

void pushans(int x)
{
    vis[x]=1;
    for(int i=hd[x];i;i=E[i].nxt)
    {
        int v=E[i].v;
        if(vis[v]||E[i].ontr==0) continue;
        if(dep[v]&1)
            lf[v]=rg[v]=vl[v]-rg[rot[v]];
        else
            lf[v]=vl[v]+lf[rot[v]],rg[v]=vl[v]+rg[rot[v]];
        pushans(v);
    }
}

signed main()
{
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%Lf%Lf",&a[i].ft,&a[i].sd);
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%lld%lld",&x,&y);
        add(x,y,dis(x,y));
        add(y,x,dis(x,y));
    }
    for(int i=1;i<=n;i++)
    {
        if(fitr[i]) continue;
        vl[i]=0;
        rg[i]=LDBL_MAX;
        findtree(i,i);
        Rt.pb(i);
    }
    for(int i=2;i<=su;i+=2)
    {
        if(E[i].ontr) continue;
        int X=E[i].u,Y=E[i].v;
        if((dep[X]&1)==(dep[Y]&1))
        {
            ld x=(E[i].w-(vl[X]+vl[Y]))/2;
            if(dep[X]&1)
                x*=-1.0;
            int rt=rot[X];
            ld l=lf[rt],r=rg[rt]; 
            if(x+eps<=l||r+eps<=x)
                return puts("NE"),0;
            lf[rt]=rg[rt]=x;
        }
        else
        {
            if(abs(vl[X]+vl[Y]-E[i].w)>eps)
                return puts("NE"),0;
        }
    }
  
    for(int i:Rt)
    {
        A=sz[i],B=b[i],C=c[i];
        ld x=-B/(2*A);
        ld l=lf[i],r=rg[i];
        if(x+eps<=l|abs(x-l)<eps)
            rg[i]=lf[i];
        else if(r+eps<=x||abs(x-r)<eps)
            lf[i]=rg[i];
        else
            lf[i]=rg[i]=x;
        pushans(i);
    }

    printf("DA\n");
    for(int i=1;i<=n;i++) printf("%.6Lf\n",abs(lf[i]));

    return 0;
}

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

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

相关文章

【Qt 学习笔记】Qt常用控件 | 输入类控件 | Date/Time Edit的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 输入类控件 | Spin Box的使用及说明 文章编号&#xff1…

【牛客】[HNOI2003]激光炸弹

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 二维前缀和板题。 注意从&#xff08;1,1&#xff09;开始存即可&#xff0c;所以每次输入x,y之后&#xff0c;要x,y。 因为m的范围最大为…

nginx--FastCGI

CGI 概念 nginx通过与第三方基于协议实现&#xff0c;即通过某种特定协议将客户端请求转发给第三方服务处理&#xff0c;第三方服务器会新建新的进程处理用户的请求&#xff0c;处理完成后返回数据给Nginx并回收进程(下次处理有需要新建)&#xff0c;最后nginx在返回给客户端…

5.7 线程

进程&#xff1a;解耦稳定&#xff0c;内容之间是不相关的&#xff0c;通信不便利&#xff0c;理论上进程的软硬件的切换时间以及创建开销非常大。--------》资源共享线程实现 线程的问题&#xff1a;本质就是不解耦&#xff0c;一个出问题别的就很有可能出问题&#xff0c;同…

【YoloDeployCsharp】基于.NET Framework的YOLO深度学习模型部署测试平台

YoloDeployCsharp|基于.NET Framework的YOLO深度学习模型部署测试平台 1. 项目介绍2. 支持模型3. 时间测试4. 总结 1. 项目介绍 基于.NET Framework 4.8 开发的深度学习模型部署测试平台&#xff0c;提供了YOLO框架的主流系列模型&#xff0c;包括YOLOv8~v9&#xff0c;以及其系…

python实现的信号合成分析系统(DSP)

python实现的信号合成分析系统(DSP) 流程 1、在QT界面上设置好信号频率,采样频率,采样点数 2、使用np构建sin函数 3、使用matplotlib画出 4、分别分析合成信号的FFT频域信息1、效果图 2、示例代码 def btn_com_clicked(self):# 信号合成分析Fs = self.com_fs_edit_value #…

HarmonyOS开发案例:【电子相册】

介绍 如何实现一个简单的电子相册应用的开发&#xff0c;主要功能包括&#xff1a; 实现首页顶部的轮播效果。 实现页面跳转时共享元素的转场动画效果。 实现通过手势控制图片的放大、缩小、左右滑动查看细节等效果。 相关概念 [Swiper]&#xff1a;滑块视图容器&#x…

cmake install命令无法覆盖同名文件

文章目录 1. 问题记录2. 原因排查3. 解决方案 1. 问题记录 我有两个同名文件test.txt&#xff0c;它们内容不同&#xff0c;但时间戳相同&#xff08;文件属性中的修改时间相同&#xff09; 我希望在cmake中利用install命令&#xff0c;将${PATH_SRC}/test.txt替换${PATH_DES…

Elasticsearch:使用 MongoDB connector 同步数据到 Elasticsearch

MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。Elasticsearch 是一个高效强…

[CISCN2019 华北赛区 Day1 Web2]ikun

看到提示说一定要找到lv6 这要写脚本来爆破了&#xff0c;用bp是爆破不出来的 发现LV等级都是有参数挂着的 写个脚本看一下 import requests for i in range(1,1000):payload"http://node4.anna.nssctf.cn:28150/shop?page%d"%(i)resrequests.get(payload)if "…

【PCIE】基于PCIE4C的数据传输(四)——使用MSIX中断

基于PCIE4C的数据传输&#xff08;三&#xff09;——遗留中断与MSI中断 一文介绍了遗留中断与MSI中断两种中断方式的代码实现&#xff0c;本文继续基于Xilinx UltrascaleHBM VCU128开发板与linux&#xff08;RHEL8.9&#xff09;&#xff0c;介绍MSIX中断方式的代码实现。本文…

矩阵的压缩存储介绍

引入 概述 特殊矩阵的压缩 对称矩阵 三角矩阵 对角矩阵 稀疏矩阵 三元组存储 十字链表法 示例

java:递归实现的案例

//求第20个月兔子的对数 //每个月兔子对数&#xff1a;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8 public class Test {//求第20个月兔子的对数//每个月兔子对数&#xff1a;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8pu…

《Python编程从入门到实践》day21

# 昨日知识点回顾 设置背景颜色 在屏幕中央绘制飞船 # 今日知识点学习 12.5 重构&#xff1a;方法_check_events()和_update_screen() 12.5.1 方法_check_events() import sys import pygame from Settings import Settings from Ship import Shipclass AlienInvasion:"…

[Maven]IDEA报错-xxx is referencing itself

在IDEA中&#xff0c;执行 mvn clean时报错xxx is referencing itself。 解决方案&#xff1a;https://stackoverflow.com/questions/64246267/maven-error-using-intellij-is-referencing-itself 具体做法&#xff1a;采用上图第二条&#xff0c;将父模块pom文件中的对子模块…

练习题(2024/5/7)

1验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左 子树 只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 …

JSP企业快信系统的设计与实现参考论文(论文 + 源码)

【免费】JSP企业快信系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89277688 JSP企业快信系统的设计与实现 摘 要 计算机网络的出现到现在已经经历了翻天覆地的重大改变。因特网也从最早的供科学家交流心得的简单的文本浏览器发展成为了商务和信息的中心…

深入理解Java虚拟机(JVM)

引言&#xff1a; Java虚拟机&#xff08;JVM&#xff09;是Java平台的核心组件&#xff0c;它负责将Java字节码转换成平台特定的机器指令&#xff0c;并在相应的硬件和操作系统上执行。JVM的引入使得Java语言具有“一次编写&#xff0c;到处运行”的跨平台特性。本文将深入探…

【练习2】

1.汽水瓶 ps:注意涉及多个输入&#xff0c;我就说怎么老不对&#xff0c;无语~ #include <cmath> #include <iostream> using namespace std;int main() {int n;int num,flag,kp,temp;while (cin>>n) {flag1;num0;temp0;kpn;while (flag1) {if(kp<2){if(…

初识C++ · 类和对象(下)

目录 1 再谈构造函数 2 类中的隐式类型转换 3 Static成员 4 友元和内部类 5 匿名对象 6 编译器的一些优化 1 再谈构造函数 先看一段代码&#xff1a; class Date { public :Date(int year, int month, int day){_year year;_month month;_day day;} private:int _ye…
最新文章