洛谷P10693

学贵坚持發表於2024-07-22

洛谷P10693

好奇怪的題目編號

題面

\(n\)個人,\(2n\)個座位,每個人都有心儀的座位,如\(i\)心儀的座位為\(a_i\)(可重複),設計師設計讓他們坐在自己編號的位置上,即\(i\)做到\(i\),每個人只可以做\(a_i\)\(i\),最多多少個人坐到心儀的座位。

思路提取

input
11
2 13 4 5 3 7 9 9 11 11 12
output
9


以人造資料為例。
首先我們讓\(i\)\(\to\)\(a_i\)連邊,整個分三種情況(對應圖中三部分)。

  • 第一部分:\(i\)坐到了\(a_i\)\(a_i\)\(\le\)\(n\))這個位置,那麼\(a_i\)就沒有地方坐了,他只能坐到他心儀的位置,也就是\(a_{a_i}\)\(a_{a_i}\)\(\le\)\(n\)),以此類推,如果最後一個人\(k\)心儀的位置是\(i\),也就是\(a_k=i,\)也就是他坐回了\(i\)這個位置,也就是他又連向了\(i\),也就是形成了一個環,那麼環上的所有人都可以做到心儀的位置上去,且最終把環上所有人原來的位置(即設計師設計的位置)都佔滿了,不會影響到環外的人,所有環都是如此,環的大小均可加入答案中。

  • 第二部分:注意到第一部分有兩個細節\(a_i\)\(\le\)\(n\)\(a_{a_i}\)\(\le\)\(n\),那麼如果大於了呢?那就連不下去了,就會出現鏈的情況,鏈中的所有人也都可以坐到心儀的位置,鏈的長度也都可加入。

  • 第三部分:前兩部分其實都有一個潛在的前提,就是所有人心儀的位置都不重複,那如果重複了呢?就會變成第三部分——有向樹,其中這個“向”都是衝著根節點的。因為每個人只有一個心儀的位置,所以出度只能為\(1\),如果不是統一方向,就會有點出度為\(2\)不符合要求,而如果都衝子節點,根節點就有可能不符合要求。第三部分就註定有人坐不到心儀的位置,那麼要取最大的,想到第二部分,我們發現最大的其實就是最長鏈,因為一條鏈上的點一定是可以都滿足的(讓他們順著坐即可,最後一定是連到了\(>n\)的位置才停的)。可以發現第二部分其實是第三部分的特殊情況。

程式碼思路