前言:整场的题目质量比较高,虽然之前做过一部分题,但还是被薄纱了
大意:
给定两个数组a,b,长度都为n,元素都介于1-m之间
定义一次操作如下:
构造一个1-m的排列p,对于对于a中的每一个元素,,得到a'
只进行一次该操作,要求使a'与b的元素不相同的位置尽可能少。并求出满足条件的字典序最小的a'
思路:
显然一次操作的本质是构造一个a到a'的单射。我们可以直接考虑映射的值。将ai与对应的bi连边,表示如果ai的映射是bi,可以造成一个贡献。我们希望最终的贡献尽可能多。显然边的权值可以累加。
所以本质上我们就是在一个二分图上寻找匹配,使得匹配边的权值之和尽可能大。也就是最大权匹配问题。如果不考虑字典序最小的话,我们可以直接用KM来解决这个问题。时间复杂度就是m^3
现在想想如何让字典序最小。说来可以,这其实是一种不算罕见的套路,但是赛时我们队还是全体宕机,但事后看看,并没有想象中的那么不可做。
显然字典序最小的前提是保持权值和最大,然后我们去修改可以连边,使得a数组中靠前的数字尽可能去匹配尽可能小的数字。为了做到这一点,我们先将a数组的元素按位置先后从小到大赋值(因为其本身的元素大小并没有什么用,我们关心的只是元素的位置)。
然后无脑跑一遍KM,得到最大的匹配权值和ans。然后我们尝试修改匹配方案。
外层遍历更新后的a数组,内层遍历映射的域,分别记为i,j。尝试将i的映射变成j,我们需要验证i->j的权值贡献加上图的其他部分的贡献与ans相同。那么将i连向其他点的权值置为0,

文章探讨了在给定的二分图上寻找最大权匹配的问题,并在保持最大权的情况下,如何找到字典序最小的匹配方案。通过构造映射和使用KM算法,可以在O(m^3)的时间复杂度内找到全局最优解。此外,还讨论了一个涉及分数排名变化的动态规划问题,利用树状数组维护每个人的分数和贡献,实现了对操作序列的高效处理。
最低0.47元/天 解锁文章
1697

被折叠的 条评论
为什么被折叠?



