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

【NAOI】套圈游戏

也许也可以放在t2 考察:性质观察能力+线性dp+dp优化+单调队列思想

题目背景:假如要出比赛题再写,而且我数据和std都没搞。

给一个长度为 \(n\) 的序列, 现在你要把这个序列拆成若干段,且保证每一段的 \(mex\) 相同。

询问最多能把这个区间分成几段,和分成最多段的方案数。

\(mex\):这是指一个序列中最小的没有出现过的非负整数。如序列 \(mex{1,2,3}=0\),因为这个序列没有出现 \(0\)

输入格式:

共两行,第一行为一个正整数 \(n\),第二行为 \(n\) 个非负整数表示序列。

输出格式:

共一行,分别表示最大区间可能和其方案数。

数据范围:

\(1\le n \le 10^6\)

部分分:我们还没想。

做法:

这题可以做到 \(O(n)\),具体如下:

首先我们有一个性质就是所有小区间的 \(mex\) 等于原来序列的 \(mex\) 证明如下:

假设我们可以取出所有区间的 \(mex\) 都不是原区间的 \(mex\) 的一种方案,现在设原序列 \(mex=x_1\) 现在所有区间的 \(mex=x_2\)

那么一定有一个区间既有 \(x_1\)\(x_2\),所以原假设不成立。

所以所有小区间的 \(mex\) 等于原来序列的 \(mex\)

有了这个性质之后我们看一下怎么求最大段数,这个可以贪心。

我们先求出原序列的 \(mex\) 那么判断一个区间是否合法的方法就是看这个区间有没有包含所有小于 \(mex\) 的数。

接下来我们可以用一个类似单调队列的东西维护每一个颜色的最晚出现时间。这样我们就可以求出来对于每一个点,最早满足成段的位置。

然后我们就可以贪心了,发现区间越早结束一定不劣,所以我们直接暴力跳下一个最早结束位置就可以了。

然后是第二问,我们显然可以想到一个 dp, \(f_{i,j}\) 表示从左往右递推到了第 \(i\) 个点,现在 \(i\) 点作为第 \(j\) 段的结束点的方案数。这个东西是 \(O(n^3)\) 的,可以用前缀和优化到 \(O(n^2)\)

接下来考虑优化,我们发现有很多状态是多余的,而转移在前缀和优化后是\(O(1)\) 的。所以考虑优化状态数。

我们发现如果一个状态要对最终的答案有贡献,那么\(f_{i,j}\) 中的 \(j\) 一定为我们贪心算出来的最优区间的区间数或者最优区间数 \(-1\)

为什么,我们来证明一下:

假如我们有一个比当前最优区间下的区间次数小 \(2\) 即以上的答案,若要对答案有贡献,则需要在后续的数中创造多余原来最优区间多 \(2\) 的区间数,这与我们最开始的贪心矛盾。

所以假设错误,我么有了上述的结论。

所以我们可靠这一点把状态数变为只有 \(2n\) 个,而且我们依旧可以用前缀和转移。最终复杂度 \(O(n)\)

http://www.sczhlp.com/news/9152/

相关文章:

  • 【总结】重链剖分
  • 【做题记录】线段树(马思博)
  • 智能体技能——工作流简单介绍
  • 第二十七篇
  • 下载 ubuntu24 arm64
  • 8月10日随笔
  • 2025.7.26 CSP-S模拟赛26
  • DBeaver执行Sql文件报错SQL Error [1406] [22001] Data truncation: Data too long for column xxx at row 1
  • 2025.7.24 CSP-S模拟赛25
  • js的实例,原型和类成员
  • 深入解析:UE5 图片9宫格切割
  • 小屏幕大影响:为功能手机开发Web应用的被遗忘艺术
  • NextAuth.js v5迁移指南与实战示例
  • MySQL 26 备库为什么会延迟好几个小时
  • 4深度学习Pytorch-神经网络--损失函数(sigmoid、Tanh、ReLU、LReLu、softmax) - 实践
  • C#自学笔记:协变和逆变
  • # 一步一步学习使用LiveBindings(10) LiveBindings绑定到漂亮的TCombobox
  • “齐俊杰投资智能体”更新到7月底
  • 行测1答案
  • java学习(8月10号)
  • java 学习笔记
  • groundDino分类训练与微调
  • 8月10日
  • 行测1试题
  • Three.js物理效果实践
  • 在MS Office文档属性中隐藏Payload的技术解析
  • 通过 SCP 和 LXD 配置迁移 CUDA 环境至共享(笔记) - 教程
  • [更新中] 重链剖分学习笔记
  • 大语言模型与结构化NLP管道集成方案
  • JDK源码之Integer