当前位置: 首页 > 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://icebutterfly214.com/news/1589/

相关文章:

  • EDK2环境搭建以及HelloWorld编译实现
  • 文件夹显示绿色成功图标方法
  • https代理服务器(六)再次java动态签发【成功】
  • Java流程控制——switch多选择结构
  • 题解:qoj1875 Nein
  • 【uni-app】申请高德地图key,封装map.js,实现H5、iOS、Android通过getlocation获取地图定位信息(摘)
  • 每日反思(2025_10_28)
  • 10月28日日记
  • 23题黄金分割
  • Day 18
  • Jenkins Share Library教程 —— 企业级 Jenkins Shared Library 实战示例
  • excel查找满足条件的第二项
  • bililun
  • 社区
  • 「Gym 102759I」Query On A Tree 17
  • 巧用 using 作用域(IDisposable)的生命周期包装特性 实现前后置处理
  • CSP-S 41多校 9
  • [题解]P5322 [BJOI2019] 排兵布阵
  • MySQL 查询与更新语句执行过程深度解析:从原理到实践​ - 指南
  • 逆向基础--编码(001)
  • Luogu P7913 [CSP-S 2021] 廊桥分配 题解 [ 绿 ] [ 贪心 ] [ 前缀和 ] [ STL ]
  • 完整教程:Docker 搭建 Nginx 并启用 HTTPS 具体部署流程
  • 10.28代码大全2
  • [GESP202509 二级] 菱形
  • linux 配置vnc
  • 第七周第二天7.2
  • 完整教程:IP 地址管理:IPv4 和 IPv6 地址规划、子网划分与 CIDR
  • Day25-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\Threadcase-多线程讲到等待唤醒机制的一半
  • C++primer 类的静态成员
  • 【硬件测试】基于FPGA的8PSK+帧同步系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR