AtCoder 🟢 ABC381E 11/22 Subsequence
題目的難度顏色使用 Luogu 上的分級,由簡單到困難分別為 🔴🟠🟡🟢🔵🟣⚫。
🔗 ABC381E 11/22 Subsequence
Problem Statement
題目簡述
給定一個只包含 1、2、/ 的字串,每次查詢一段子字串,要求在這段範圍內選出一個最長子序列,使它形如若干個 1、一個 /、再接上相同數量的 2。若無法選出任何合法的 11/22 字串,輸出 0。
Constraints
約束條件
- 是長度為 的字串,且只包含
1、2、/ - 輸入皆為整數或合法字元
思路:二分答案
一個合法的 11/22 子序列長度一定是奇數,並且可以寫成:
因此,問題轉化為:對每個查詢區間,找出最大的 ,使得區間內能依序選出 個 1、一個 /、再 個 2。答案即為 。
為什麼不能直接統計數量?
因為子序列仍然要維持原本順序。即使區間內有足夠多的 1、2、/,也必須存在一個 /,讓前面的 1 都能放在它左側,後面的 2 都能放在它右側。
為什麼可以二分答案
若 可行,則任何更小的 也必然可行——只需捨棄多餘的配對,因此可行性具有單調性,故每個查詢可以對 進行二分搜尋,找出最大的可行值。
檢查給定的 是否可行
要檢查 是否可行,最寬容的貪心策略是讓 1 盡量靠左、2 盡量靠右,以最大化中間能放 / 的範圍:
- 在查詢區間內,取左側第 個
1的位置。 - 在查詢區間內,取右側倒數第 個
2的位置。
若這兩個位置之間至少存在一個 /,則 可行——選這兩個位置之間的任一個 / 即可配對。
反之,若這樣最寬容的安排都找不到中間的 /,任何其他選法只會讓 / 的可用範圍更窄,因此 必然不可行。
找到區間內左側第 個 1 和右側倒數第 個 2 的位置,可以用二分搜尋在預先記錄的 1 和 2 的位置列表中找到。檢查兩個位置之間是否有 /,則可以用前綴和在 時間內完成。
結論
固定 時只需要關心「第 個可用的 1」與「倒數第 個可用的 2」之間是否有 /,因此每次可行性檢查只需兩次位置二分搜尋搭配一次前綴和查詢,可在 內完成。
複雜度分析
- 時間複雜度:
- 預處理 個字元的位置信息和前綴和需要 。
- 對於每個查詢,二分答案 需要 ,每次檢查 的可行性又需要兩次二分搜尋(各 )和一次前綴和查詢(),總計 。
- 空間複雜度:
Code
1 | from bisect import bisect_left, bisect_right |
本部落格所有文章除特別聲明外,均採用CC BY-NC-SA 4.0 授權協議。轉載請註明來源 十六個天亮!
評論
WalineGiscus








