[题解] CF1969F Card Pairing

这是一篇学习笔记

好题。考察了找阶段,和对 dp 原理的理解。

下文提及手牌,指的是打牌后、拿牌前的状态。

首先,原问题可以转化成:要求在某些 $a_i=a_j$ 之间连线(显然不会跨相同的数连),使得跨过每个 $a_{2t}$ 与 $a_{2t+1}$ 之间间隙的线的数量 $\le k-2$。这个转化是很直接的,因为连线左端的卡必须保留在手中。有可能产生疑问的一点是:如果一对 $a_{2t-1}$ 和 $a_{2t}$ 均为连线右端,那有一对卡就要顺延到后一轮才能打出,那就在待配对卡的基础上多了一对需要保留的牌啊?但由于这种情况跨 $a_{2t}$ 与 $a_{2t+1}$ 间隙的线的数量必然比跨 $a_{2t-1}$ 与 $a_{2t-1}$ 间隙的少 $2$,故这个间隙不必考虑。实际上就是能打出相同牌的轮,手牌数不变多。因此接下来认为如果拿到两张牌目前均可配对就一次性配掉,即手牌可以 $<k-2$。

处理转化后的问题。首先,如果没有 $\le k-2$ 的限制,就是从左往右扫,发现配对了就连线(下称“贪心”)。由于手牌数不可能为奇(后续不可能配对的牌也要保留在手里),故只有为 $k$ 时会不合法,这时直觉上来说要决策放弃两张牌。但是光这么考虑,总感觉不完备,凭什么只用这种决策方式就一定能覆盖最优解?

从另一个角度看,解的结构可以表述为:强制禁止某几对相同的数连线,然后剩余的贪心,要求最终合法。那么,如果某条线连了不会导致不合法,那禁掉它一定不优(如果不禁导致后面贪心得到的连线改变而不合法,可以在后面禁),因此可以在第一次发现不合法时禁。于是,上文 dp 的过程,就可以理解为决策禁哪些,然后分段贪心。

令 $f_i$ 表示 $a_{2i}$ 与 $a_{2i+1}$ 处出现了不合法,前面的最优答案。没法直接枚举放弃的两张牌,先考虑直接往后贪心。注意到如果后面某一时刻手牌数为 $k-2$,那么如果放弃的是缺的两张牌,那么这个时刻就会不合法。如果这两张牌的组合在之前没出现过,则要转移。直接转移到末尾的情况需要讨论一下。

一个实现问题是,如何快速求出缺的两张牌。可以记录缺的牌的和与平方和,也可以惰性删除,将所有新扫到的牌放在一个栈里,求时全拿出来判断。

时间复杂度 $\mathrm{O}(n^2)$,代码

Licensed under CC BY-NC-SA 4.0

评论

使用 Hugo 构建
主题 StackJimmy 设计