Loading

[笔记] 用合并处理选数的一类问题

模型概述

给出 \(n\) 个数,可以在一定的限制下,以相对自由的顺序选择完所有的数,每次选择将会产生一定的贡献。

处理方式

对于具体题目具体分析,把一定会一起选的部分合并在一起,使得问题变简单。

习题

[YZOJ] 7117 Mythological VII

给出一个长度为 \(n\) 的序列 \(a_i\) 和初始位置 \(s\),每次可以吞并当前位置左边或右边的数,问是否存在一种方案,使得将所有的数都吞并,且满足选数之和一直非负。

题解

先将所有的正负数缩成一块:正数显然是一起取,负数如果不打算全部取完的话,没必要先取一部分让和变小。

那么当前局面形如 -+-+-+-+-,如果两边都不能吞并,或者只有一边能吞并到正数,都是很好判断下一步怎么做的,如果两边都可以吞并到正数的部分,不妨直接让负数和正数合并,再继续做。

[YZOJ] 7123 双人游戏

给出一个长度为 \(n\) 的序列 \(a_i\)\(A,B\) 轮流操作,从两端任意一端选择一个数,最终分数为选择的数之和,两人都希望自己的分数尽量高,问两人都采取最优策略的情况下,最终得分分别是多少。

题解

考虑某相邻的三个数 \(x,y,z\),若 \(x\le y\ge z\),那么一方拿了 \(x\) 或者 \(z\) 后,另一方一定会拿走 \(y\),此时之前的一方就不得不再去拿走剩下的那个 \(x\) 或者 \(z\) 来弥补损失。所以在最优策略下,两个人的差值是固定的 \(x-y+z\),可以将这三张木牌合并成一张权值为 \(x-y+z\) 的等价木牌。

用栈保存木牌,每次新来一张牌时,不断合并最后 \(3\) 张木牌直到不满足 \(x\le y\)\(y\ge z\)。这样之后,栈中的权值一定是先递减再递增。所以最优策略就是每次取两头里面较大的那个数。

然后一个结论是,在数据随机的情况下,栈中的元素是 \(\log\) 级别。

[AGC023F] 01 on Tree

给出一棵 \(n\) 个节点的树,每个节点上有一个取值在 \(\{0, 1\}\) 中的数,每次可以选择没有父亲节点的点,问按顺序选出的序列最小逆序对数。

题解

考虑这样一件事情,对于一个全局最优的序列,选择了其父亲之后,一定会马上选择它,所以不妨每次直接将全局最优序列与父亲合并。

至于两点序列谁更优,按照 \(cnt_0,cnt_1\) 的个数判断,也就是说,放前面新产生逆序对个数较少的更优。

posted @ 2022-03-09 21:38  IrisT  阅读(35)  评论(0编辑  收藏  举报