看起来就很像匹配问题嘛,连题目名都在提示你=。=
这题真是把匹配问题的细节发挥到了极致,不过还好送70,考场上应该不至于挂得太惨
那不如先说说70分的暴力怎么写
对于测试点2,3,n,m很小。第一问$O(n^{m+1})$暴力枚举答案(结果),第二问对每个选手枚举他新的名次变成第一问。复杂度$O(n^{m+3})$(为啥官方题解说是$O(n^{m+2})$?算了反正都能过)
对于C=1的测试点,导师们不并列。第一问直接模拟,第二问仍然枚举新名次(这题第二问都是这样直接转成第一问做=。=)。复杂度$O(n^4)$不太能过。不过把第二问的枚举换乘二分就稳了,复杂度$O(n^3\log n)$
来考虑正解
正解1 魔改匈牙利
我们从$b_i=1$的部分分开始— —每个导师都只选一个人,类似二分图匹配,只是多了一个优先级,怎么做?做法是动态加边,我们仍然依次考虑每个选手,把他的志愿从高到低依次加入,加一个就尝试在这条路上增广(匈牙利单次增广复杂度为$O(m)$),这样总复杂度是$O(n*m)$的(匈牙利的复杂度)。然后第二问还是熟悉的二分转第一问,总复杂度$O(n^4\log n)$($m$是$n^2$级别的),变得更差了=。=???
(官方题解:)
不要着急,慢慢改进嘛=。=
一个优化是一个人的一个志愿增广失败就再把边删掉,复杂度$O(Cn^3\log n)$,常数小也许能跑过去
先继续考虑$b_i$不一定为$1$的情况,来尝试抢救一下之前的算法:把导师拆点来跑,加上优化复杂度$O(max_b*Cn^3\log n)$
原文:https://www.cnblogs.com/ydnhaha/p/10439537.html