Codeforces 1842I. Tenzing and Necklace

news/2024/12/23 22:26:30/文章来源:https://www.cnblogs.com/DeaphetS/p/18625185

神仙题。本题解参考官方题解进行编写,并补充了最后比较关键的怎么调整 \(m\)

题目链接:I - Tenzing and Necklace

题目大意:给定一个环,环上有 \(n\) 个点与 \(n\) 条边,第 \(i\) 条边连接 \(i\)\(i\bmod n +1\),边权为 \(a_i\)。要求断开若干边使得环断为若干段,并且每一段上点的个数不超过 \(k\),求断开边权和的最小值。

开场的三个结论

首先钦定必须断开 \(m\) 条边,并设 \(S_i\) 表示,在环上断开的编号最小的边的编号为 \(i\) 时,花费最小的断边编号序列(编号从小到大排列)。官方题解采用了较大篇幅描述了以下三点:

  • \(x\lt y\),令 \(A=S_x,B=S_y\)。可以通过只对 \(B_2,B_3,\dots,B_m\) 进行调整,使得对 \(\forall 1\le i\le m\),均能满足 \(A_i\le B_i\),且调整前后对应的花费不变。同理,也可以通过只对 \(A_2,A_3,\dots,A_m\) 进行调整使其满足对应条件;
  • \(A,B\) 满足 \(A_i\le B_i\) 的基础上,可以进一步只对 \(B_2,B_3,\dots,B_m\) 进行调整,使得对 \(\forall 1\le i\lt m\),均能满足 \(A_i\le B_i\le A_{i+1}\)。同理,也可以通过只对 \(A_2,A_3,\dots,A_m\) 进行调整使其满足对应条件;
  • 对任意 \(y\gt A_2\),一定有 \(S_{A_2}\) 对应的花费不比 \(S_y\) 大。

前三个结论的证明

这几个结论的详细证明可参考官方题解,这里提供几个配图进行辅助说明,不感兴趣可以跳过。

结论一

\(x\lt y\),令 \(A=S_x,B=S_y\)。可以通过只对 \(B_2,B_3,\dots,B_m\) 进行调整,使得对 \(\forall 1\le i\le m\),均能满足 \(A_i\le B_i\),且调整前后对应的花费不变。同理,也可以通过只对 \(A_2,A_3,\dots,A_m\) 进行调整使其满足对应条件。

取环上的某一段进行说明,若此时存在 \(A_i\gt B_i\),考虑之后的第一个位置 \(j\) 使得 \(A_j\le B_j\)。注意到由于是在环上,所以一定存在这样的情况(最坏情况是回到开头,\(j=m+1\))。

我们把这种情况画出来,如图所示,红色代表方案 \(A\) 选取的断点,蓝色代表方案 \(B\) 选取的断点,显然同色点之间的距离是符合题目要求的。

这时我们发现,把黄色部分的每对红蓝点进行对调,是依旧能符合同色点之间的距离要求的。而把所有蓝色点都变到对应红色点的位置上,正好能符合 \(A_i\le B_i\) 的要求。

在对应的花费上,由于 \(A,B\) 分别代表着各自起始位置的最优解,所以在调整之后的花费肯定不能比原来的更少(无论是红 $\to $ 蓝还是蓝 \(\to\) 红)。所以黄色区间内红色点权值和一定和蓝色点权值和相同,因此能满足花费不变的条件。

结论二

\(A,B\) 满足 \(A_i\le B_i\) 的基础上,可以进一步只对 \(B_2,B_3,\dots,B_m\) 进行调整,使得对 \(\forall 1\le i\lt m\),均能满足 \(A_i\le B_i\le A_{i+1}\)。同理,也可以通过只对 \(A_2,A_3,\dots,A_m\) 进行调整使其满足对应条件。这里假设 \(A_1\lt B_1\le A_2\)

同样考虑第一次出现 \(B_i\ge A_{i+1}\) 的位置,同理一定存在 \(B_j\lt A_{j+1}\)

原理和结论一的证明类似,可以发现将紫色线画出的几对红蓝点进行一一互换能保证满足条件。

结论三

对任意 \(y\gt A_2\),一定有 \(S_{A_2}\) 对应的花费不比 \(S_y\) 大。

找到最小的 \(i\) 满足 \(B_i\le A_{i+1}\),如图所示。

按照箭头所示将蓝色断点全部移动到对应位置,即可完成调整。由于 \(A\) 是一个固定 \(A_1\) 为开头的最优解,所以若将红点变成对应蓝点(此时红色点间距离一定满足限制),对应花费一定不会减少。因此完成蓝 \(\to\) 红的转化后花费一定不会变大。

找出某个 \(m\) 对应的最优解

以上几点实际上证明了这么一件事情,当我们需要求某个 \(S_y\) 的时候,若此时我们已经拥有 \(x,z\) 使得 \(x\lt y\lt z\)\(S_x\)\(S_z\) 均已被求出,那么可以保证一定存在对应的最优解使得:对 \(\forall 1\le i\le m\),有 \(S_x(i)\le S_y(i)\le S_z(i)\)。这里 \(S_x(i)\) 表示编号序列 \(S_x\) 的第 \(i\) 个元素。于是我们可以考虑分治求解。

具体的,我们先在原问题上找到必须断开第 \(0\) 条边(也就是第 \(n\) 条边)的最优解(不限制断开的边数)。这个可以看成一个在序列上的问题,可以使用单调队列维护 DP 轻松求出,我们称这个解对应的断边编号序列为原始解 \(A\),并令 \(m=|A|\)。(这里注意,这个 \(m\) 其实并不是我们钦定的,而是我们求出来的)

根据之前的结论,一定存在一个最优解 \(B\) 使得 \(A_i\le B_i\le A_{i+1}\) 恒成立,所以可以在此基础上进行分治。

\(Sol([L_1,R_1],[L_2,R_2],\dots,[L_m,R_m])\) 表示当前需要求出符合条件 \(B_i\in [L_i,R_i]\) 的最优解 \(B\),一开始 \(L_i=A_{i-1},R_i=A_i\),特别的我们令 \(L_1=1\)

在求解时,我们可以先令 \(b_1=\lfloor\frac{L_1+R_1}{2}\rfloor\),然后使用朴素的线性 DP 求出符合限制条件的一组解 \(b\),并且可以递归计算 \(Sol([L_1,b_1),[L_2,b_2],\dots,[L_m,b_m])\)\(Sol((b_1,R_1],[b_2,R_2],\dots,[b_m,R_m])\)。这样最多递归 \(\log\) 层,每层都可以合计在 \(O(n)\) 的时间复杂度内求解,于是可以做到 \(O(n\log n)\) 的一次对 \(m=|A|\) 的求解。

对于 \(m\) 为其他值的情况

官方题解对这种情况的说明较为简略,我们分两部分说明。

全局最优解的序列长度调整

设我们一开始求出的原始解为 \(A\),最终的最优解为 \(B\),其中 \(|A|=m,|m-|B||\ge 2\),不妨设 \(m\gt |B|\)

考虑第一个出现 \(B_i\ge A_{i+1}\) 的位置,如图所示,由于 \(m-|B|\ge 2\) 一定会出现这样的情况。注意到由于 \(A\)\(B\) 分别是某特定条件下的最优解,所以图中一定不会出现连续三个及以上的同色点,否则完全可以做到删去中间的那个断点使得在满足题目限制的情况下花费变少,产生矛盾。

此时对上图中绿色区间内的红蓝点集合进行对调,首先还是和之前的证明思路一样,对调后同色点间的距离仍然满足条件,且花费不会产生变化,所以可以通过一次调整使得最优解的序列长度 \(+1\),于是在不断的调整过后可以让 \(B\) 的长度变为 \(m-1\)。对于 \(|B|\gt m\) 的情况也可以使用类似的调整,于是一定存在 \(m'\) 使得存在断点序列长度为 \(m'\)\(|m-m'|=1\) 的全局最优解。

找到断边个数为 \(m-1\)\(m+1\) 的最优解

于是我们只需要分别找到断边个数为 \(m-1\)\(m+1\) 的最优解即可。但问题是在求这个最优解之前我们需要先找到一个固定开头且固定断边条数为对应值时的最优解。

这个问题看上去可以采用 wqs 二分的思想做,即给所有边钦定一个固定的增量,按照之前我们求原始解的方式去求出一个对应条件下的最优解,并判断边条数是否满足要求,在此基础上进行二分。但这题存在一个致命的问题,就是不一定存在断边条数恰好符合要求的增量,比如样例一。

不过貌似是存在某种很牛的调整法求出对应初始解的,且 MagicalFlower 应该是采用的这种做法,感兴趣的大佬可自行了解。

下面介绍另一种做法。

对于 \(m+1\) 的情况是比较好做的,对于原始解跑一遍 \(Sol([0,0],[L_1,R_1],[L_2,R_2],\dots,[L_m,R_m])\) 即可求出一个断边条数为 \(m+1\) 的初始解 \(b_0\sim b_m\)。这是因为若存在 \(b_i\notin [L_i,R_i]\),那么根据抽屉原理,一定存在某个区间 \([L_j,R_j]\) 内有两个断点,就会出现如图所示的情况。

那么对绿色范围内的点进行调整即可做到让蓝点均落在对应红点的区域内。

对于 \(m-1\) 的情况,当然首先要判一下断边数量是否可以再减少,这一判断是平凡的,之后跑一遍 \(Sol([0,0],[L_2,R_2],[L_3,R_3],\dots,[L_{m-1},R_{m-1}])\) 即可求出一组初始解 \(b_1\sim b_{m-1}\),其中 \(b_1=0\)。这时我们把 \([R_{m-1},L_2]\) 看成一个额外的区间(这个区间跨过了 \(0\) 点),这样也是共 \(m-1\) 个区间。同样的,若出现了 \(b_i\notin [L_i,R_i]\) 的情况,依旧会出现某个区间内有两个断点,采用相同的方式调整即可。

在求出两种情况的初始解后,再次采用之前分治的处理方式即可求出断边个数为 \(m-1\)\(m+1\) 的最优解,比较一下即可得到全局最优解。

实现细节

由于一开始运行 \(Sol([L_1,R_1],[L_2,R_2],\dots,[L_m,R_m])\) 时,会有 \(R_i=L_{i+1}\) 的情况,所以如果实现不当的话会出现自己向自己转移的情况,需要注意规避。

在分治过程中由于 \(L,R\) 是会一直改动的,所以需要把整个数组传下去或者直接开个栈来记录当前对每个断点的限制。

代码先咕着。

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

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

相关文章

Docker-compose 实战

以下是一个使用 Docker-compose 启动 Flask 应用的示例: 项目结构:app/|-- app.py|-- requirements.txt|-- Dockerfile|-- docker-compose.ymlapp.py 文件内容: from flask import Flaskapp = Flask(__name__)@app.route(/) def hello_world():return Hello from Flask in D…

Doc for DevNow

DevNow 官方文档,介绍 DevNow 的使用方法及一些扩展内容,方便大家使用前言 DevNow 是一个精简的开源技术博客项目模版,支持 Vercel 一键部署,支持评论、搜索等功能,欢迎大家体验。 🎉🎉 首先庆祝下 DevNow star 在不久前过百,对我来说还是蛮有成就感的,感谢大家的支…

巧用mask属性创建一个纯CSS图标库

说明mask 是CSS中的一个属性,它允许开发者在元素上设置图像作为遮罩层。这个属性的强大之处,在于它可以接受多种类型的值,包括关键字值、图像值、渐变色,甚至可以设置多个属性值。 SVG(Scalable Vector Graphics,可缩放矢量图形)是一种基于 XML 的图像格式,用于定义二维…

绕过CPU:英伟达与IBM致力推动GPU直连SSD以大幅提升性能

绕过CPU:英伟达与IBM致力推动GPU直连SSD以大幅提升性能| Id | Title | DateAdded | SourceUrl | PostType | Body | BlogId | Description | DateUpdated | IsMarkdown | EntryName | CreatedTime | IsActive | AutoDesc | AccessPermission | | -------------| -------------…

如何屏蔽博客园新出的标题栏?一行代码屏蔽博客园冒出的标题栏!

如何屏蔽博客园新出的标题栏?一行代码屏蔽博客园冒出的标题栏!| Id | Title | DateAdded | SourceUrl | PostType | Body | BlogId | Description | DateUpdated | IsMarkdown | EntryName | CreatedTime | IsActive | AutoDesc | AccessPermission | | -------------| -----…

【Adobe Illustrator 2025下载与安装】

1、安装包 我用夸克网盘分享了「Illustrator 2025」, 链接:下载地址 2、安装教程(安装前关闭系统防护) 1) 下载软件安装包,双击Set-up.exe安装2) 修改安装目录,点击继续3) 安装完成,点击启动4) 启动程序

geoserver 上传sld文件后,格式变为ANSI,导致的一系列问题

windows平台下,以geoserver-2.21.5默认样式dem为例,在修改其中的某个值为中文后,出现报错:UTF-8序列的字节无效先不管,点击保存后出现中文字体字符编码错误问题。 到data_dir/styles找到对应的文件,发现sld文件变为ANSI格式(原是utf-8),另存为UTF-8格式后,重新查看样…

Vscode实现应用qss样式表

qss简介 qss(Qt Style Sheets)是一种基于CSS的样式语言,用于描述用户界面元素的外观和感觉。qss可以让用户在不修改代码的情况下,轻松地自定义应用程序的外观。 其语法基本如下: objectName{property: value; }其中,objectName是要设置样式的对象名,property是要设置的属…

【嵌入式开发】链接让你的程序在内存中找到正确位置

一、空间和地址分配 二、符号解析与重定位 三、静态库链接前面已经了解了ELF目标文件的内容,本篇文章的重点在于怎么将多个目标文件链接起来形成一个可执行文件。 现在链接器的链接过程主要分两步: 1、空间和地址分配 2、符号解析与重定位 下面来看一下,这两个步骤具体干了什…

校园二手交易平台UML图

类图:时序图: 买家买商品:买家撤回:用户更新:用户登录:卖家发布:用例图:

2 升力线理论

2 升力线理论 2.1 减阻 阻力 什么是阻力?阻力是阻止主要运动(位移向量)的力。 可以用一个简单的公式描述阻力: \[\begin{equation}\overrightarrow{R_2}-\overrightarrow{R_1}\propto\vec{T}-\vec{D} \end{equation} \]这里的R是反作用力(reactive force),T是推力(thru…