#46159: 解題思路


henry.rem.rem@gmail.com (*ฅ́˘ฅ̀*)

學校 : 臺北市立松山高級中學
編號 : 278368
來源 : [61.231.20.66]
最後登入時間 :
2025-06-15 17:49:41

解題思路:

觀察題目,可以發現若有輛公車的行經路線為 [a, b],

只要終點落在 [a, b) 這個半開區間的所有公車,皆可轉乘到這輛公車上,

因此這輛公車的搭乘方法數會是區間內的公車搭乘方法數之和,

若其起點為 0 的話就再加一,因為其必定含有從 0 上車的這一個搭乘方法。

又因為我們需要透過終點判斷是否得以轉乘,

即在計算當前公車搭乘方法數前,我們必須得知所有終點落於 [a, b) 間的公車搭乘方法數

因此考慮將所有路線依照終點排序,並由終點較小的公車往後計算,確保所需結果都已經計算完成。

實作策略:

若使用爆破的方式線性掃描,找出所有終點落在 [a, b) 間的公車並計算搭乘方法數之和,

最糟的複雜度會是 n 輛公車 * 每次都要掃過 n 輛公車的路線,也就是 O(n2),

顯然無法通過測資的 n ≤ 2 * 105,因此需要考慮壓縮計算量。

由上述解題思路可以發現,我們需要的

所有終點落在 [a, b) 間的公車搭乘方法數之和,

由於在計算該公車搭乘方法時所需資料都已經計算完畢,

因此可以透過前綴和的方式將計算量壓縮至 O(1),

接著就剩下尋找第一輛終點 ≥ a 的公車和最後一輛終點 < b 的公車

說到搜尋,當然就是二分搜了對吧。

範例解法

 

ps.

我在寫這題時,解題思路是不難想,原以為可以很快解開,

結果在二分搜和前綴和更新的邏輯上卡了好幾小時,

果然基本觀念才是最重要的呢,啊哈...