思路
题意
有一个长度为 的整数列表 初始恰好为 的排列; 有一个集合 初始为空, 进行 次操作, 第 次操作如下:
. 选择列表最中间位置的数第 个数, 从列表中删除该数字, 并将该删除的数字加入集合
. 如果不是最后的第 次操作, 则再任选列表中的一个数字删除
操作结束后, 列表为空, 集合 包含了 个数字
你需要求出集合 里面的单个连续数字段的最大可能值
一个连续数字段指集合 的一个子集, 满足这个子集的数去重排序之后任意相邻两个数差全部都为
- 定义操作 (约束) 和开销 / 收益, 要求最值化开销 / 收益
- 模拟操作, 找性质
- 将约束条件数学化
- 最优化问题的瓶颈, 考虑找最优解的性质来处理
- 枚举开销对应的值\((\)超过 \(x\) / 不大于 \(x\) / 长度为 \(x\)\()\) , 然后考虑对于这个值进行
- 贪心
- 判断合法性
- 逐元素处理
- 先找到统一的构造方式
- 直接处理
- 推导动态规划
肯定需要先模拟操作
对于数据 4 7 3 6 1 2 5
, 你枚举可能的最终 \(\mathbb{S}\)
不难观察到性质
第一次只能选 \(6\) , 第二次依据删除位置可以选 \(1, 3\) 中的一个, 第三次依据删除位置可以选 \(\cdots\)
分析之后发现形似这样的选择方式
只要在当前步数对应的区间中且不曾被选择过, 就可以被选择
但是这个思路还是太难以发现了
你注意到每次选择什么只关于删除点的位置在相对左还是相对右
但是删除左右都有不止一个选择, 不难发现贪心的删除那个以后一定取不到的即可
反正不管怎么样你必须得到这个结论
难啊难
得到这个结论之后, 我们考虑怎么判定最长连续数字段
想到枚举连续数字段之后, 判定连续数字段的合法性
因为我们可以有 \(n + 1\) 次操作, 每次我们贪心的选择最外层的钦定选择点, 把决策留到后面去
因此考虑按照 \(\min\{i, n - i + 1\}\) 来对必选数进行排序, 按序选择
什么时候不合法呢?
当对于一个点, 我们必不可能选到他, 那么值域区间 \([L, R]\) 无解
考虑怎么表示, 不妨记 \(p_{a_i} = \min\{i, n - i + 1\}\) , 那么如果 \(\sum_{i = L}^{R} [p_i \leq k] > k\) , 则无解
也就是说对于值 \(a_i\) , 其可能被后缀 \(p_{a_i}\) 个区间选择, 但是如果太多值不好分配, 那就挂了
总而言之, 形式化约束条件为 \(p_{a_i} = \min\{i, n - i + 1\}\) , 要求 \(\sum_{i = L}^{R} [p_i \leq k] \leq k\)
这个简单做一下可以用值域区间数据结构维护, 不赘述, 但是一定要知道高效维护往往需要形式化约束
然后发现合法值域区间的单调性, 双指针维护即可
总结
思路不对要赶紧换, 一般转化策略和直接模拟都要试一下
贪心思想: 把决策留给后面
区间问题考虑单调性
有些思想真的不好用语言来解释是怎么想到的, 怎么办