1. 程式人生 > >解題:八省聯考2018 劈配

解題:八省聯考2018 劈配

人的 優先級 log 動態 結果 二分 tro problem 題解

題面

看起來就很像匹配問題嘛,連題目名都在提示你=。=

這題真是把匹配問題的細節發揮到了極致,不過還好送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)$

解題:八省聯考2018 劈配