解題思路:
觀察題目,可以發現若有輛公車的行經路線為 [a, b],
只要終點落在 [a, b) 這個半開區間的所有公車,皆可轉乘到這輛公車上,
因此這輛公車的搭乘方法數會是區間內的公車搭乘方法數之和,
若其起點為 0 的話就再加一,因為其必定含有從 0 上車的這一個搭乘方法。
又因為我們需要透過終點判斷是否得以轉乘,
即在計算當前公車搭乘方法數前,我們必須得知所有終點落於 [a, b) 間的公車搭乘方法數,
因此考慮將所有路線依照終點排序,並由終點較小的公車往後計算,確保所需結果都已經計算完成。
實作策略:
若使用爆破的方式線性掃描,找出所有終點落在 [a, b) 間的公車並計算搭乘方法數之和,
最糟的複雜度會是 n 輛公車 * 每次都要掃過 n 輛公車的路線,也就是 O(n2),
顯然無法通過測資的 n ≤ 2 * 105,因此需要考慮壓縮計算量。
由上述解題思路可以發現,我們需要的
所有終點落在 [a, b) 間的公車搭乘方法數之和,
由於在計算該公車搭乘方法時所需資料都已經計算完畢,
因此可以透過前綴和的方式將計算量壓縮至 O(1),
接著就剩下尋找第一輛終點 ≥ a 的公車和最後一輛終點 < b 的公車。
說到搜尋,當然就是二分搜了對吧。
ps.
我在寫這題時,解題思路是不難想,原以為可以很快解開,
結果在二分搜和前綴和更新的邏輯上卡了好幾小時,
果然基本觀念才是最重要的呢,啊哈...