当前位置: 首页 > news >正文

CodeForces-2153D Not Alone

CodeForces-2153D Not Alone

tag: 结论题,一维线性 DP

给定一个环形序列 \(b\),长度为 \(m\),每次操作可以将一个数加一或减一。

问最少需要多少次操作,可以使序列 \(b\) 中每一个元素至少与一个相邻元素相等。

环形序列是指:除了 \(b_i\)\(b_{i+1}\)\(1\le i<m\))相邻,\(b_m\)\(b_1\) 也相邻。\(\sum m\le2\cdot10^5\)

感谢 dbxxx 的帮助。

相当于将序列分组,每组中至少有两个数,执行操作使每组中所有数相等。

先考虑非环形的序列,即忽略 \(b_m\)\(b_1\) 相邻的情况。

结论:每组只包含两个或三个数,可以使答案最优。

感性证明:首先,若已经分组,那么经典的结论是,将这一组中所有数变为它们的中位数,所需操作最少。

对于连续的四个数,从左到右分别为 \(a,b,c,d\),画图理解:

image-20251011172211967

显然右侧的更优(至少不劣)。交换 \(a,b\) 或交换 \(c,d\) 或交换 \((a,b),(c,d)\) 都不影响结果,因此上面已经考虑到了所有情况。

对于连续的五个数,也是同样的道理,但这时应该分为 \((a,b,c),(d,e)\) 还是 \((a,b),(c,d,e)\) 是不确定的,需要分类讨论。

考虑 DP,设 \(f(i)\) 表示将 \(b_1,\cdots,b_i\) 变为合法序列的代价。那么讨论 \((i,i-1)\)\((i,i-1,i-2)\) 为一组,故

\[f(i)=\min\{f(i-2)+R(i-1,i),f(i-3)+R(i-2,i)\}, \]

其中极差 \(R(l,r)=\max\{b_l,\cdots,b_r\}-\min\{b_l,\cdots,b_r\}\)

现在考虑环形序列的情况。环与链的区别只是在于,需要多考虑 \((b_m,b_1),(b_{m-1},b_m,b_1),(b_m,b_1,b_2)\) 这三种分组。

故只需要对 \(b'=(b_2,\cdots,b_{m-1},b_m,b_1)\)\(b''=(b_3,\cdots,b_{m-1},b_m,b_1,b_2)\) 再跑两遍即可。

Submission #343107772 - Codeforces

http://www.gsyq.cn/news/33288.html

相关文章:

  • EDK2环境搭建以及HelloWorld编译实现
  • P1561 [USACO12JAN] Mountain Climbing S
  • 以此贴作别算法
  • 正点原子--手把手教你轻松入门C语言及STM32
  • 【RabbitMQ】与ASP.NET Core集成
  • IMO2025 Problem 1
  • Java流程控制——switch多选择结构
  • P3607 [USACO17JAN] Subsequence Reversal P 题解
  • 随笔/杂记
  • 使用 Swift 解析验证码(结合 Tesseract OCR)
  • 常见排序算法Java实现
  • 175天 隧道技术篇防火墙组策略FRPNPSChiselSocks代理端口映射C2上线
  • link元素的用法及HTML样板
  • 10月28号
  • https://avoid.overfit.cn/post/44c8d547475340d59aa4480f634ea67f
  • Day 18
  • STM32之fromelf生成bin和反汇编文件
  • 常用存储器介绍
  • P11307 [COTS 2016] 建造费 Pristojba 分析
  • 乱学点东西#2 :菠萝/蓝莓/Boruvka算法
  • 文件清理,推荐几款常用软件
  • 【学习笔记】数据结构全家桶
  • 零散点小总结(25.10.28)
  • Top Tree大学习
  • EVE-NG导入华为等镜像的方法
  • 2025 云斗
  • c++ ranges随笔
  • P10259 [COCI 2023/2024 #5] Piratski kod
  • 软考复习总结
  • ? #6