专题训练 - 贪心 I
[CF5C] Longest Regular Bracket Sequence
其实我也不知道这个题目为什么会有贪心的标签,看上去和贪心貌似没有关系。
令 ,有递推公式 ,如果 ,则为 ,否则 。
我们可以画出 与 的图象,以它结尾的最长的括号串是 s.t. 且 且不存在一个 使得 。
既然这是一个一个跳的,类比连续函数的介值定理,如果存在一个 使得 ,就一定存在一个位置从 降到 。
所以我们可以用某种方式每次记录下来 ,每当遇到 时,就把 至为无效,这样每次能够查询到的都是有效的数字。
具体地说,我们可以用 表示值 对应的所有下标,然后把值 至为无效就是清空 。
当到 时,我们查询 ,如果是空则以不存在这样的 ,否则 中所有元素都是合法的 。
在这些合法的 中,我们需要的是最小的那个值,所以 实际上只需要存无效 / 合法下标的最小值即可,不需要真的存下所有合法的下标。
[CF1372D] Omkar and Circle
可以看出,答案会被 个位置贡献,那么这里就自然会有一个问题,如果答案是被位置集合 贡献得到,其中 ,是否会存在一个 使得 并且 也是一个合法的序列?
答案是肯定的,考虑在某一步中 三个位置集合相邻,其中 而这一步选择了 ,那么会得到一个 。既然 ,那么它被合成出来的上一步一定满足位置关系 ,我们显然可以分别选择 得到 。
所以,只要我们选择了某一个 个元素复合形成的元素,就一定存在另一种方式使得我们选择它的不相交子集,并且得到一个不会更劣的答案。
因此这一步贪心可以保证我们每次选择的元素都是在最开始序列中出现的元素,那么我们可以考虑什么样的元素是可以被合并的。
不难看出,如果我们把原来的 重排为 ,只有相邻项的元素会被合并,又因为上面阐述的贪心的思路保证了我们不会选择合并之后的元素,所以这一定是连续 个元素的和的最大值。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 喵喵小窝!