[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];elself[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]];elself[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];elself[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.mzph.cn/web/7971.shtml

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

相关文章

AI大模型程序员小白入门 - 关于如何更好地学习算法

关于本书 本项目旨在打造一本开源免费、新手友好的数据结构与算法入门教程。 全书采用动画图解,内容清晰易懂、学习曲线平滑,引导初学者探索数据结构与算法的知识地图。源代码可一键运行,帮助读者在练习中提升编程技能,了解算法工作原理和数据结构底层实现。提倡读者互助学…

git bash各分支修改内容不同但合并后不显示冲突问题

在跟着廖雪峰老师的git学习时&#xff0c;按部就班的执行明后&#xff0c;发现 而不是出现原文的结果 解决方法&#xff1a; 切换位feature分支&#xff0c;再合并 git switch feature1 git merge master 此时我们发现&#xff1a; 后面再跟着原文敲就可以了

双指针类型解题汇总

1 最接近的三数之和 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数&#xff0c;使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。 示例&#xff1a;输入&#xff1a;nums [-1,2,1,-4], target 1 输出&am…

每日一题5:Pandas-修改列

一、每日一题 一家公司决定增加员工的薪水。 编写一个解决方案&#xff0c;将每个员工的薪水乘以2来 修改 salary 列。 返回结果格式如下示例所示。 解答&#xff1a; import pandas as pddef modifySalaryColumn(employees: pd.DataFrame) -> pd.DataFrame:employees.loc[…

如何更好地使用Kafka? - 故障时解决

要确保Kafka在使用过程中的稳定性&#xff0c;需要从kafka在业务中的使用周期进行依次保障。主要可以分为&#xff1a;事先预防&#xff08;通过规范的使用、开发&#xff0c;预防问题产生&#xff09;、运行时监控&#xff08;保障集群稳定&#xff0c;出问题能及时发现&#…

Databend 开源周报第 143 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 了解 Databend …

Redis学习(十)|使用消息队列的重试机制实现 MySQL 和 Redis 的数据一致性

文章目录 介绍原理整体方案实现步骤示例代码总结其他&#xff1a;Kafka 重试策略配置1. 生产者重试策略配置2. 消费者重试策略配置 介绍 在分布式系统中&#xff0c;保持 MySQL 和 Redis 之间的数据一致性是至关重要的。为了确保数据的一致性&#xff0c;我们通常采取先更新数…

去中心化金融与Web3:科技驱动的金融革命

随着区块链技术的发展和普及&#xff0c;去中心化金融&#xff08;DeFi&#xff09;作为其重要应用之一&#xff0c;正在成为金融领域的一场革命。结合Web3技术&#xff0c;去中心化金融正在以前所未有的方式重新定义着金融服务和产品的交付方式&#xff0c;推动着金融领域的创…

bfs之八数码

文章目录 八数码解题思路图解举例算法思路 代码CPP代码Java代码 八数码 在一个 33的网格中&#xff0c;1∼8这 8个数字和一个 x 恰好不重不漏地分布在这 33 的网格中。 例如&#xff1a; 1 2 3 x 4 6 7 5 8在游戏过程中&#xff0c;可以把 x 与其上、下、左、右四个方向之一…

【Oracle】Linux x86-64 安装Oracle 23AI指南

本文为云贝教育 刘峰 原创&#xff0c;请尊重知识产权&#xff0c;转发请注明出处&#xff0c;不接受任何抄袭、演绎和未经注明出处的转载。 前言 在信息技术日新月异的今天&#xff0c;企业级数据库系统扮演着数据管理与业务支撑的核心角色。Oracle数据库&#xff0c;作为全球…

IAP15W4K61S4单片机EEPROM读写程序

/*-------------关闭IAP----------------*/ void IapIdle() { IAP_CONTR 0; //关闭IAP功能 IAP_CMD 0; //清除命令寄存器 IAP_TRIG 0; …

专业软件测试会议

全国软件测试会议&#xff1a;这是一个系列性的专业会议&#xff0c;由中国的学术机构或专业组织主办&#xff0c;例如中国计算机学会的容错计算专业委员会。此会议自2005年起开始举办&#xff0c;历届会议地点包括北京、昆明和武汉等地。会议内容覆盖软件测试理论、实践、工具…

跟TED演讲学英文:4 pillars of college success in science by Freeman Hrabowski

4 pillars of college success in science Link: https://www.ted.com/talks/freeman_hrabowski_4_pillars_of_college_success_in_science Speaker: Freeman Hrabowski Date: February 2013 文章目录 4 pillars of college success in scienceIntroductionVocabularyTranscr…

uniapp打包的程序在Xcode中运行到模拟器报错的解决方法

uniapp打包的程序在Xcode中运行到模拟器报错的解决方法 问题描述&#xff1a; Building for iOS-simulator, but linking in object file (/Users/hori/Documents/SDK/SDK/Libs/DCUniRecord.framework/DCUniRecord[arm64][3](PGRecord.o)) built for iOS Linker command fail…

Day 25 数据库查询

数据库查询 一&#xff1a;基本查询 1.简介 ​ 单表查询 ​ 简单查询 ​ 通过条件查询 ​ 查询排序 ​ 限制查询记录数 ​ 使用集合函数查询 ​ 分组查询 ​ 使用正则表达式查询 2.案例 创建案例所需表&#xff1a;company.employee5 雇员编号 id int雇…

ISIS的工作原理

1.邻居关系建立 &#xff08;1&#xff09;IS-IS领接关系建立原则 1、通过将以太网接口模拟成点到点接口&#xff0c;可以建立点到点链路邻接关系。 2、当链路两端IS-IS接口的地址不在同一网段时&#xff0c;如果配置接口对接收的Hello报文不作IP地址检查&#xff0c;也可以建…

【AI】Tavily

Tavily是一个为人工智能代理&#xff08;如大型语言模型&#xff0c;LLMs&#xff09;和检索增强生成&#xff08;RAG&#xff09;应用优化的搜索引擎。它旨在提供高效、快速和持久的搜索结果。Tavily Search API 允许人工智能开发人员轻松地将他们的应用程序与实时在线信息集成…

深入理解MySQL的Purge机制

在MySQL中&#xff0c;尤其是在使用InnoDB存储引擎时&#xff0c;Purge机制起着至关重要的作用。它主要负责清理那些因为早期的版本或删除操作而不再需要的数据行版本。本文将详细介绍MySQL中的Purge机制&#xff0c;包括其作用、工作原理、如何配置以及优化步骤。 1. Purge机…

网络基础(1)详解

目录 1.计算机网络背景 2.网络协议 3.网络中的地址管理 1.计算机网络背景 1.1 网络发展 (1)计算机从独立模式到网络互联(多态计算机连接共享数据)再到局域网LAN(通过交换机和路由器连接)接着是广域网WAN 1.2 协议 协议就是双方的一种约定. 为什么要有协议? 因为在数据长距…

LeetCode 面试经典150题 252.会议室

题目&#xff1a;给定一个会议时间安排的数组 intervals &#xff0c;每个会议时间都会包括开始和结束的时间 intervals[i] [starti, endi] &#xff0c;请你判断一个人是否能够参加这里面的全部会议。 思路&#xff1a;因为一个人在同一时刻只能参加一个会议&#xff0c;因此…