Petrozavodsk Winter 2023. Day 1 部分题解

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

前言:整场的题目质量比较高,虽然之前做过一部分题,但还是被薄纱了

Changing the Sequences

大意:
给定两个数组a,b,长度都为n,元素都介于1-m之间

定义一次操作如下:

构造一个1-m的排列p,对于对于a中的每一个元素,a_i=p_{a_i},得到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,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值