Try   HackMD

AA 競程 2023 TOI 模擬賽(初賽 I) B 題完整題解

重要觀察:若一個組合成立,假設一所學校最後一個被錄取的人是第一所學校的第
p1
順位(
p1
x
),第二所學校最後一個被錄取的人是
p2
順位(
p2
y
)。且第一所學校前
p1
順位和第二所學校前
p2
順位共通的人數必是
p1+p2xy
(令其為
K
)。


引裡 1: 把遞補學生當成是有序的事件,最後被遞補的人假設是第

i 所學校的第
pi
順位,那麼它不可能在另外一所學校的前
p3i
順位。

證明:假設最後錄取學校的人是第

1 所學校第
p1
順位的人,那麼他被錄取時,肯定是同時有兩所學校的資格的,因為他在第
2
所學校不會無緣無故地放棄,得到矛盾。


引裡 2:不妨假設最後一個被錄取的人是第

1 所學校第
p1
順位的人,那麼,
p2
可能的範圍和滿足第
1
所學校前
p11
個人和第二所學校前
j
個人中恰有
x+y1
個不重複的人的
j
的範圍是相等的。

證明
step 1: 假設現在已經遞補到第 1 所學校第 t1 個人,以及第 2 所學校第 t2 個人,如果 t1 < p1 - 1 且 t2 < p2 那麼,一定有一個人存在某個人同時被兩間學校錄取且還沒放棄,那就任選一人放棄,直到 t1 = p1 - 1 或 t2 = p2。
step 2: 如果現在 t1 = p1 - 1 但 t2 < p2,此時仍至少存在某個人同時被兩間學校錄取且還沒放棄,不可能所有滿足這樣條件的人的都是選擇第 2 間學校,如果是的話,就代表最終第 2 間學校錄取的所有人都在前 t2 順位,這與我們假設矛盾。
step 3: 如果現在 t2 = p2 但 t1 < p1,那麼肯定存放棄的人都是第一間學校的人,可以一直放棄。


解題演算法:對於可能的 (p1, p2) 組合分三種情況:

  1. 最終被錄取的不可能是
    p2
  2. 最終被錄取的不可能是
    p1
  3. 最終被錄取的可能是
    p1
    p2

可使用雙指針,對於所有

p1,找到最大及最小的
j
滿足第
1
間學校的前
p11
順位的人和第二間學校的前
j
個人去重後人數為
x+y1
,令其為
js
jb
,若第
1
間學校第
p1
順位的人 在第二間學校順位
jb
,略過不考慮, 否則,當
p2=js+1jb
時,是第
1
種 case,
p2=js
時是第 2 種 case,每個
p2
的可能值都可以預處理組合數 O(1) 計算出方法數,且需要枚舉的
p2
值不超過
O(n)
,這樣子就能分別算出前兩種情況的總數量,第三種的數量只要改成枚舉
p2
即可算出。