引裡 1: 把遞補學生當成是有序的事件,最後被遞補的人假設是第 所學校的第 順位,那麼它不可能在另外一所學校的前 順位。
證明:假設最後錄取學校的人是第 所學校第 順位的人,那麼他被錄取時,肯定是同時有兩所學校的資格的,因為他在第 所學校不會無緣無故地放棄,得到矛盾。
引裡 2:不妨假設最後一個被錄取的人是第 所學校第 順位的人,那麼, 可能的範圍和滿足第 所學校前 個人和第二所學校前 個人中恰有 個不重複的人的 的範圍是相等的。
證明:
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) 組合分三種情況:
可使用雙指針,對於所有 ,找到最大及最小的 滿足第 間學校的前 順位的人和第二間學校的前 個人去重後人數為 ,令其為 和 ,若第 間學校第 順位的人 在第二間學校順位 ,略過不考慮, 否則,當 時,是第 種 case, 時是第 2 種 case,每個 的可能值都可以預處理組合數 O(1) 計算出方法數,且需要枚舉的 值不超過 ,這樣子就能分別算出前兩種情況的總數量,第三種的數量只要改成枚舉 即可算出。