LGP6891题解

算是对同学@serene_analysis 做法的理解。。。

考虑随便拉一个合法的 AB 序列,若不存在直接输出 -1。

考虑调整。假设这个序列中 A 还差 \(k\) 个才能满足第二条限制。(B 差也一样)

找到一个为 B 的位置,先判断直接翻转是否会对前面的序列造成影响,(指从这个位置开始不满足第三条限制)若能够翻转,向后一直搜索是否需要翻转后面的一段,最后翻转的部分要满足 B 的部分比 A 多恰好一个。

然后重复这样的过程我们就能得到一组解。

听上去是正确的,但是如何保证一定能够满足第二条限制?

此题的难点在于第二条限制,我们可以将其解释成让 A 选恰好 \(n\) 个,让 \(A\) 选至少 \(n\) 个,至多 \(n\) 个。。。也可以解释成 让选择的 \(A\)\(B\) 一一对应形成一个二分图最大匹配

将序列上的每一个位置抽象成一个节点,若有两个位置相连说明这两个位置一个为 A 一个为 B,可以知道一组合法解一定对应一种二分图最大匹配。(可以证明图一定是二分图,但是左右部节点在开始时并未被确定)

实际上匹配边没有任何意义,我们只需要知道每个点是否被匹配。但是注意到一件事情,如果两个点相连意味着右边的一定比左边大,也就是说 匹配边内部是可以乱序的

比如对于 AABB,可以解释成 \((1,3)(2,4)\),也可以解释成 \((1,4)(2,3)\)

刚才的过程相当于,我们将匹配边乱序,然后将翻转部分任意匹配,这样子会多出一个“B节点”,反转后“B”节点会变成“A节点”,然后可以去匹配闲置的“B节点”。

这个过程显然是匈牙利的过程,因此若存在满足条件的最大匹配一定能够搜索出一组解。

upd:感觉还是有点不严谨,有没有老哥能来完善一下证明啊qaq

posted @ 2022-07-15 15:35  Prean  阅读(11)  评论(0编辑  收藏  举报
var canShowAdsense=function(){return !!0};