八省聯考2018 劈配

2022-08-20 02:12:10 字數 3884 閱讀 8401

一年一度的綜藝節目《中國新**》又開始了。zayid 從小就夢想成為一名程式設計師,他覺得這是乙個展示自己的舞台,於是他毫不猶豫地報名了。

輕車熟路的zayid 順利地通過了海選,接下來的環節是導師盲選,這一階段的規則是這樣的:

總共n 名參賽選手(編號從1 至n)每人寫出乙份**並介紹自己的夢想。接著 由所有導師對這些選手進行排名。為了避免後續的麻煩,規定不存在排名並列的情況。

同時,每名選手都將獨立地填寫乙份志願表,來對總共 m 位導師(編號從 1 至 m)作出評價。志願表上包含了共m 檔志願。對於每一檔志願,選手被允許填寫最多c 位導師,每位導師最多被每位選手填寫一次(放棄某些導師也是被允許的)。

在雙方的工作都完成後,進行錄取工作。每位導師都有自己戰隊的人數上限,這意味著可能有部分選手的較高志願、甚至是全部志願無法得到滿足。節目組對」前i 名的錄取結果最優「 作出如下定義:

前1 名的錄取結果最優,當且僅當第1 名被其最高非空志願錄取(特別地,如 果第1 名沒有填寫志願表,那麼該選手出局)。

前i 名的錄取結果最優,當且僅當在前i - 1 名的錄取結果最優的情況下:第i 名 被其理論可能的最高志願錄取(特別地,如果第i 名沒有填寫志願表、或其所有 志願中的導師戰隊均已滿員,那麼該選手出局)。

如果一種方案滿足『『前n 名的錄取結果最優』』,那麼我們可以簡稱這種方案是最 優的。

每個人都有乙個自己的理想值si,表示第i 位同學希望自己被第si 或更高的志願錄取,如果沒有,那麼他就會非常沮喪。

現在,所有選手的志願表和排名都已公示。巧合的是,每位選手的排名都恰好與它們的編號相同。

對於每一位選手,zayid 都想知道下面兩個問題的答案:

在最優的錄取方案中,他會被第幾志願錄取。

在其他選手相對排名不變的情況下,至少上公升多少名才能使得他不沮喪。

作為《中國新**》的實力派**手,zayid 當然輕鬆地解決了這個問題。不過他還是想請你再算一遍,來檢驗自己計算的正確性。

從檔案mentor.in 中讀入資料。

每個測試點包含多組測試資料,第一行 2 個用空格隔開的非負整數 t;c,分別表示資料組數、每檔志願最多允許填寫的導師數目。

接下來依次描述每組資料,對於每組資料:

第1 行兩個用空格隔開的正整數n , m。

n,m 分別表示選手的數量、導師的數量。

第2 行m 個用空格隔開的正整數:其中第i 個整數為 \(b[i]\) , 表示編號為i 的導師戰隊人數的上限。

第3 行至第n + 2 行,每行m 個用空格隔開的非負整數:其中第i + 2 行左起第 j 個數為 \(a[i][j]\).

​表示編號為i 的選手將編號為j 的導師編排在了第\(a[i][j]\) 志願。

特別地,如果 a_​ = 0,則表示該選手沒有將該導師填入志願表。

第n + 3 行n 個用空格隔開的正整數,其中第i 個整數為 s[i]

​ 表示編號為i 的選手的理想值。

在這一部分,保證 \(s[i]<=m\)

按順序輸出每組資料的答案。對於每組資料,輸出2 行:

第1 行輸出n 個用空格隔開的正整數,其中第i 個整數的意義為:

在最優的錄取方案中,編號為i 的選手會被該檔志願錄取。

特別地,如果該選手出局,則這個數為m + 1。

第 2 行輸出 n 個用空格隔開的非負整數,其中第 i 個整數的意義為:

使編號為i 的選手不沮喪,最少需要讓他上公升的排名數。

特別地,如果該選手一定會沮喪,則這個數為i。

3 5

2 21 1

2 21 2

1 12 2

1 11 2

1 22 1

2 21 1

0 10 1

2 2

2 1

1 01 2

0 11 3

0 1

1 5

4 32 1 1

3 1 3

0 0 1

3 1 2

2 3 1

2 3 3 3

1 1 3 2

0 0 0 0

網路流

但是感覺挺麻煩的

我調了快一天了==

話說我以前好像沒大寫過動態加邊

但是這道題不動態加邊是錯的

因為在退流時可以從與這個同學無關的邊流過來

話說這題建圖倒是沒啥難度

就是從源點向每個人連條流量為1的邊

導師向匯點連一條流量為導師戰隊人數上限的邊

如果學生在第i志願選到了導師,其他的志願就沒有任何連邊的意義了

所以我們存下在第i個同學選完後的圖

然後我們就對於每個學生按照志願從小到大連邊

每次加入該同學的所有第t志願選擇的導師

一旦有增廣路就退出輸出答案

並且刪掉除了第t志願的邊並記錄圖

這樣就解決了第一問

考慮用二分處理第二問

只需要二分出ta在第k名時可以選到ta所希望選到的志願

然後直接用我們上面所記錄的有k - 1個同學選完的圖

然後連上第i同學志願<=ta所希望的邊check

這樣第二問就完成辣

話說這題好麻煩啊

#include#include#include#includeconst int m = 210 ;

const int n = 10005 ;

const int inf = 1e9 ;

using namespace std ;

inline int read()

while(c>='0'&&c<='9')

return x*w ;

}int n , m , s , t ;

int b[m] , a[m][m] , num[m][m] , vol[m][m][m] , wish[m] ;

queue < int > q ;

struct graph edge[n] ;

inline void _link(int from , int to , int dis)

inline void add_edge(int from , int to , int dis)

inline bool bfs() }}

return d[t] ;

}int dfs(int u , int flow) }}

if(!sum) d[u] = -1 ;

return sum ;

}inline int dinic()

}g[m];

inline void clear()

inline bool check(int x , int i)

int main()

for(int i = 1 ; i <= n ; i ++)

for(int j = 1 ; j <= m ; j ++)

// num[i][j]表示第i個人的第j志願報了幾個導師

// vol[i][j][k]表示第i個人的第j志願的第k個是幾號導師

for(int i = 1 ; i <= n ; i ++) wish[i] = read() ;

for(int i = 1 ; i <= n ; i ++) // 第幾個人

for(int j = 1 ; j <= m ; j ++)

if(j == m) printf("%d ",m + 1) ;

}printf("\n") ;

for(int i = 1 ; i <= n ; i ++)

printf("%d ", l) ;

}printf("\n") ;

}return 0 ;

}

八省聯考2018 劈配

題目這題目,乍一眼看上去像乙個dp,因為這個資料範圍一般都是dp,但是考慮到轉移有後效性,所以顯然是做不了dp的。考試的時候像著怎麼設狀態沒有後效性,失敗了,就只打了乙個70分的暴力,還掛了20分。這題其實是個 網路流 匹配 真心看不出,然後我寫部落格的時候旁邊yl神犇看見了,嘲諷了我一波,我是真的...

八省聯考2018 劈配

題解 這題思路就是暴力。主要在於分析複雜度?dinic跑二分圖 msqrt n 這題好像用不到。首先這是個匹配問題顯然需要利用網路流 考慮第一問 每一次我們就暴力按照志願順序加入邊 直到二分圖匹配數 1 這個複雜度是 nm nm 的 因為一次只增廣一條邊所以每次是nm的,不過這個很明顯是跑不滿而且差...

八省聯考2018 劈配(最大流)

從源到每乙個人連一條容量為 1 的邊。從每乙個導師到匯連一條容量為導師戰隊人數的邊。第一問我們依次列舉每乙個學員,然後再依次與第 1 至 m 志願的老師連邊,如果與第 i 志願的導師連邊跑最大流使得最大流改變,說明找到了乙個導師與自己對應。自己的最小的能實現的志願就是 i 如果找不到志願i的導師要把...