一年一度的綜藝節目《中國新**》又開始了。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 52 21 1
2 21 2
1 12 2
1 11 2
1 22 1
2 21 1
0 10 1
2 2
2 11 01 2
0 11 3
0 1
1 54 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的導師要把...